在 groupBy 选择后计算总记录数

Posted

技术标签:

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

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

谢谢。

【问题讨论】:

【参考方案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

【讨论】:

以上是关于在 groupBy 选择后计算总记录数的主要内容,如果未能解决你的问题,请参考以下文章

如何在laravel中计算groupby结果的记录数?

jsp分页计算总页数公式

group的加权平均值不等于pandas groupby中的总平均值

分页总数计算,根据总记录数获取分页总数_目标科技

求如何用mysql实现计算上下两条记录的差

Group by