【问题标题】:count total records after groupBy select在 groupBy 选择后计算总记录数
【发布时间】:2011-02-11 10:52:26
【问题描述】:

我有一个具有 groupBy 的 mysql 选择查询。 我想统计分组后的所有记录。 有没有办法直接从 mysql 中解决这个问题?

谢谢。

【问题讨论】:

    标签: mysql select count group-by


    【解决方案1】:

    如果您唯一需要的是分组后的计数,并且您不想使用 2 个单独的查询来找到答案。你可以用这样的子查询来做到这一点......

    select count(*) as `count`
    from (
        select 0 as `doesn't matter`
        from `your_table` yt
        group by yt.groupfield
    ) sq
    

    注意:您必须在子查询中实际选择某些内容,但您选择的内容并不重要

    注意:所有临时表都必须有一个命名别名,因此末尾有“sq”

    【讨论】:

      【解决方案2】:

      你可以使用FOUND_ROWS():

      SELECT <your_complicated_query>;
      SELECT FOUND_ROWS();
      

      它确实适用于 LIMIT,告诉您没有 LIMIT 会返回多少行,但它似乎适用于不使用 LIMIT 的查询。

      【讨论】:

      • SELECT之后不要忘记SQL_CALC_FOUND_ROWS
      • 这在任何情况下都很糟糕,尤其是当您拥有数百万条记录时
      • FOUND_ROWS() 已弃用:dev.mysql.com/doc/refman/8.0/en/…
      【解决方案3】:

      有关示例,请参阅此查询:

      此查询用于查找酒店的可用房间记录,只需检查此

      SELECT a.type_id, a.type_name, a.no_of_rooms,
             (SELECT SUM(booked_rooms) FROM reservation
             WHERE room_type = a.type_id
             AND start_date >= '2010-04-12'
             AND end_date <= '2010-04-15') AS booked_rooms,
             (a.no_of_rooms - (SELECT SUM(booked_rooms)
                        FROM reservation
                    WHERE room_type = a.type_id
                    AND start_date >= '2010-04-12'
                    AND end_date <= '2010-04-15')) AS freerooms
      FROM room_type AS a
      LEFT JOIN reservation AS b
      ON a.type_id = b.room_type
      GROUP BY a.type_id ORDER BY a.type_id
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-06-18
        • 2018-10-02
        • 1970-01-01
        • 1970-01-01
        • 2017-11-19
        • 1970-01-01
        相关资源
        最近更新 更多