开发者社区> 问答> 正文

distinct的情况下,总件数获取错误

SQL文中包含distinct的情况下,获取到的总件数是distinct前的件数。 因为SQL为:SELECT DISTINCT COUNT(*) FROM XXX 应该把distinct放在count内或者count的时候放在最外层。

分页查询的时候,需要获取总件数,场景如下: 比如SQL文为:【select distinct a.col1,a.col2 from test a 】这时候实际件数为10件,其中重复的有5件。 框架拼出来的总件数检索SQL-_COUNT文为:【SELECT DISTINCT COUNT(*) FROM test a】 这样获取到的件数为distinct之前的件数,为10件。但实际应该是5件(去重之后的件数)

原提问者GitHub用户brood-wangxr

展开
收起
山海行 2023-07-05 21:00:35 67 0
2 条回答
写回答
取消 提交回答
  • 北京阿里云ACE会长

    在使用DISTINCT关键字进行查询时,如果使用COUNT函数来获取查询结果的总件数,可能会出现总件数获取错误的情况。这是因为COUNT函数会将DISTINCT关键字内的所有列作为一个整体进行计算,从而导致总件数的计算不准确。

    为了解决这个问题,可以使用子查询来获取DISTINCT关键字内的查询结果,然后再对子查询的结果进行COUNT计算。例如,假设您要查询表中不重复的用户数量,可以使用以下SQL语句:

    Copy
    SELECT COUNT(*) FROM (SELECT DISTINCT user_id FROM table_name) tmp;
    在这个SQL语句中,我们使用了一个子查询来获取DISTINCT关键字内的查询结果,然后对子查询的结果进行COUNT计算。这样可以确保总件数的计算正确性。

    另外,如果您使用的是MySQL数据库,还可以使用SQL_CALC_FOUND_ROWS关键字和FOUND_ROWS()函数来获取查询结果的总件数。具体来说,您可以使用以下SQL语句:

    Copy
    SELECT SQL_CALC_FOUND_ROWS DISTINCT user_id FROM table_name;
    SELECT FOUND_ROWS();
    在这个SQL语句中,我们首先使用SQL_CALC_FOUND_ROWS关键字来告诉MySQL计算查询结果的总件数,然后在查询结束后使用FOUND_ROWS()函数来获取总件数。这种方法可以避免使用子查询,同时也可以确保总件数的计算正确性。

    2023-07-30 13:02:35
    赞同 展开评论 打赏
  • PageUtils支持count(distinct)实现啊

    String sql = "select distinct a.col1,a.col2 from test a"; String result = PagerUtils.count(sql, JdbcConstants.MYSQL); assertEquals("SELECT DISTINCT COUNT(*)\n" + "FROM test a", result);

    原回答者GitHub用户wenshao

    2023-07-06 11:53:29
    赞同 展开评论 打赏
问答分类:
SQL
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载