我经常使用单独的查询来计算行,以便在查询表中的分页结果时设置总变量。
返回表格中的总用户数
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"); //?
答案 0 :(得分:3)
在子查询
之后添加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
答案 1 :(得分:2)
两个观察结果:
1&GT;您的计数查询不应使用'*',而是可以编写如下查询:
SELECT Count(1)FROM users WHERE organizationId =:organizationId
或
SELECT Count(column1)FROM users WHERE organizationId =:organizationId
2 - ;使用count作为子查询并不是一个好主意,因为它可能会被执行多次并增加到性能开销中。当然,你还没有在表演中获得任何东西,因为它还有两个问题。
如果预期“结果集”大,我建议使用2个不同的查询。在开头只使用一次计数查询。对于后续页面,只能执行详细信息查询。
如果预期“结果集”小,您可以加载所有结果并执行客户端分页以获得最佳性能。在这种情况下,只对所有页面执行一个查询。