MySQL将Count作为变量包含在查询中

MySQL将Count作为变量包含在查询中,mysql,Mysql,我经常使用一个单独的查询来计算行数,以便在查询表的分页结果时设置一个总变量 返回表中的用户总数 SELECT Count(*) FROM users WHERE organizationId = :organizationId 返回分页结果 SELECT * FROM users WHERE organizationId = :organizationId LIMIT :start, :end public SearchResults findAll(User user, Paginator

我经常使用一个单独的查询来计算行数,以便在查询表的分页结果时设置一个总变量

返回表中的用户总数

SELECT Count(*) FROM users WHERE organizationId = :organizationId
返回分页结果

SELECT * FROM users WHERE organizationId = :organizationId LIMIT :start, :end

public SearchResults findAll(User user, Paginator paginator) {
        HashMap<String, Object> namedParameters = new HashMap<String, Object>();
        namedParameters.put("organizationId", user.getOrganizationId());
        namedParameters.put("userId", user.getId());
        NamedParameterJdbcTemplate namedParameterJdbcTemplate = new NamedParameterJdbcTemplate(dataSource);

        //Get count
        int total = namedParameterJdbcTemplate.queryForInt(SQL_FIND_ALL_COUNT, namedParameters);
        int start = 0;
        int end = total;

        if(paginator != null) {         
            start = paginator.getFirst();
            end = paginator.getCount();
        }

        namedParameters.put("start", start);
        namedParameters.put("end", end);
        SqlRowSet results = namedParameterJdbcTemplate.queryForRowSet(SQL_FIND_ALL, namedParameters);
        return new SearchResults(mapUser(results), total);
    }
如果上面的查询有效,我如何实际获取子查询列,它是否有我可以引用的名称

results.getInt("count"); //?
在子查询后添加别名

SELECT  *, 
       (
        SELECT Count(*) 
        FROM users 
        WHERE organizationId = :organizationId
       ) `COUNT`
FROM users
WHERE organizationId = :organizationId
查询中的替代解决方案是使用交叉连接

在子查询后添加别名

SELECT  *, 
       (
        SELECT Count(*) 
        FROM users 
        WHERE organizationId = :organizationId
       ) `COUNT`
FROM users
WHERE organizationId = :organizationId
查询中的替代解决方案是使用交叉连接

两项意见:

1> 计数查询不应使用“*”,而是可以编写如下查询:

从organizationId=:organizationId的用户中选择Count1

从organizationId=:organizationId的用户中选择Countcolumn1

2> 使用count作为子查询不是一个好主意,因为它可能会被执行多次并增加性能开销。当然,您在性能方面没有任何收获,因为它仍然有两个查询

如果预期结果集很大,我建议使用两个不同的查询。开始时仅使用计数查询一次。对于后续页面,只能执行详细信息查询

如果预期结果集很小,则可以加载所有结果并执行客户端分页以获得最佳性能。在这种情况下,只对所有页面执行一个查询

两个观察结果:

1> 计数查询不应使用“*”,而是可以编写如下查询:

从organizationId=:organizationId的用户中选择Count1

从organizationId=:organizationId的用户中选择Countcolumn1

2> 使用count作为子查询不是一个好主意,因为它可能会被执行多次并增加性能开销。当然,您在性能方面没有任何收获,因为它仍然有两个查询

如果预期结果集很大,我建议使用两个不同的查询。开始时仅使用计数查询一次。对于后续页面,只能执行详细信息查询


如果预期结果集很小,则可以加载所有结果并执行客户端分页以获得最佳性能。在这种情况下,只对所有页面执行一个查询

好的,这就是获得专栏的方法。对于这是否有利于innoDB引擎的性能,有什么建议吗?从可用性的角度来看,这当然更容易,因为我不必不断地执行单独的查询,但是当返回大的结果集时……它会减慢速度吗?这会比单独的查询一起提供性能增益吗?或者交叉连接会使单个查询变慢吗?很抱歉,我无法回答您有关性能的问题,因为我无法使用查询计划对其进行测试。尝试查看两个查询上的执行计划:D谢谢。很公平。还有一个问题。从交叉联接获取列时,我是简单地使用results.getIntx还是在交叉联接中向子查询添加别名?好的,这就是获取列的方法。对于这是否有利于innoDB引擎的性能,有什么建议吗?从可用性的角度来看,这当然更容易,因为我不必不断地执行单独的查询,但是当返回大的结果集时……它会减慢速度吗?这会比单独的查询一起提供性能增益吗?或者交叉连接会使单个查询变慢吗?很抱歉,我无法回答您有关性能的问题,因为我无法使用查询计划对其进行测试。尝试查看两个查询上的执行计划:D谢谢。很公平。还有一个问题。从交叉联接获取列时,我是简单地使用results.getIntx还是在交叉联接中向子查询添加别名?
SELECT  *, x.totalCount
FROM users, 
       (
        SELECT Count(*) totalCount
        FROM users 
        WHERE organizationId = :organizationId
       ) x
WHERE organizationId = :organizationId