2

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

返回表中的用户总数

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);
    }

收集总数的唯一原因是我可以将其作为搜索结果的一部分返回,因为它是分页所必需的,所以我知道要向用户显示多少页结果,而无需实际传递结果并在其中找到每条记录数据库。

有没有办法在一个查询中做到这一点?因此,换句话说,获取总计数,同时仍然使用 LIMIT 条件仅查询特定数量(例如一次 10 条记录)。如果是这样,从性能的角度来看,将它们保存在单独的查询中是否更有意义?

像这样的东西?

SELECT *, (SELECT Count(*) FROM users WHERE organizationId = :organizationId) FROM users WHERE organizationId = :organizationId"

如果上述查询有效,我如何实际获取该子查询列,它是否有我可以引用的名称?

results.getInt("count"); //?
4

2 回答 2

2

ALIAS在子查询之后添加

SELECT  *, 
       (
        SELECT Count(*) 
        FROM users 
        WHERE organizationId = :organizationId
       ) `COUNT`
FROM users
WHERE organizationId = :organizationId

您查询中的替代解决方案是使用CROSS JOIN

SELECT  *, x.totalCount
FROM users, 
       (
        SELECT Count(*) totalCount
        FROM users 
        WHERE organizationId = :organizationId
       ) x
WHERE organizationId = :organizationId
于 2012-10-04T04:01:11.280 回答
2

两个观察:

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

SELECT Count(1) FROM users WHERE organizationId = :organizationId

或者

SELECT Count(column1) FROM users WHERE organizationId = :organizationId

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

如果预期的“结果集”很大,我建议使用 2 个不同的查询。一开始只使用一次计数查询。后续页面只能进行详情查询。

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

于 2012-10-04T04:11:30.543 回答