【问题标题】:How to count all the rows of a table from a query with some filters who has a limit?如何使用一些有限制的过滤器从查询中计算表的所有行?
【发布时间】:2020-12-09 23:31:42
【问题描述】:

我会尝试更具体,假设我有这个查询:

SELECT * FROM users WHERE status = 1 LIMIT 5;

在我的表 users 中,我有 40 个用户的状态 = 5,但在我的查询中,我限制为 5,这很好,这就是我想要做的。

但是现在,我需要统计所有状态 = 1 的用户(无限制),在这种情况下,有 40 个用户具有该状态。

如何在不进行其他查询的情况下做到这一点?

我不想进行其他查询,因为在我真正工作的查询中我有更多过滤器,而且我认为使用相同过滤器(限制除外)进行双重查询会花费不必要的资源我的服务器。

另外,我不想从我的查询中删除LIMIT 5 并在代码中取 5,因为我有太多具有该状态的用户,并获取所有这些用户只是为了计数,这是不必要的, 我想一定有更好的办法,你能帮帮我吗?

【问题讨论】:

    标签: mysql sql select count mariadb


    【解决方案1】:

    如果您使用的是最新版本的 MariaDB 或 MySQL 8+,那么您可以在这里使用COUNT 作为窗口函数:

    WITH cte AS (
        SELECT *, COUNT(*) OVER () AS cnt
        FROM users
        WHERE status = 1
    )
    
    SELECT *
    FROM cte
    ORDER BY some_column
    LIMIT 5;
    

    请注意,使用LIMIT 而不使用ORDER BY 是毫无意义的,因为在这种情况下,您没有告诉数据库你想要哪五条记录。添加ORDER BY 子句以获得最佳效果。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-12-13
      • 2022-01-21
      • 1970-01-01
      • 2011-02-11
      • 2021-04-11
      • 1970-01-01
      • 2018-02-16
      • 1970-01-01
      相关资源
      最近更新 更多