You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MySQL查询:分组统计后获取结果总行数(无需UNION ALL)

解决方案:在分组统计结果中添加总行数字段

我来帮你搞定这个问题,核心需求就是在现有分组查询的每一行结果里,加上整个结果集的总行数(也就是你提到的8),而且不能使用UNION ALL。下面给你两种可行的实现方式:

方法一:兼容低版本MySQL(5.x及以上)

这种方法通过派生表+交叉连接的方式,先计算出分组后的总行数,再将这个数值和每一行分组结果关联起来:

SELECT 
    t.*, 
    total_rows.totalCount
FROM (
    -- 原有的分组统计查询
    SELECT 
        id, 
        groupType, 
        IF(groupType != 2, @gf:=id, @gf:=CONCAT('group_',refer_id)) as group_field, 
        count(*) as total 
    FROM myTable 
    GROUP BY group_field 
    ORDER BY id asc
) t
-- 交叉连接子查询计算分组后的总行数
CROSS JOIN (
    SELECT COUNT(*) as totalCount
    FROM (
        -- 需和外层分组逻辑完全一致,确保得到正确总行数
        SELECT 
            IF(groupType != 2, @gf_inner:=id, @gf_inner:=CONCAT('group_',refer_id)) as group_field
        FROM myTable 
        GROUP BY group_field
    ) temp
) total_rows;

逻辑说明:

  1. 内层temp子查询和原查询的分组逻辑完全对齐,用来计算最终生成的分组总数(也就是8);
  2. 通过CROSS JOIN将总数值与每一行分组结果关联,让每一行都带上totalCount=8。

方法二:使用窗口函数(MySQL 8.0及以上)

如果你的MySQL版本是8.0或更高,窗口函数会让实现更简洁,无需嵌套多层子查询:

SELECT 
    id, 
    groupType, 
    IF(groupType != 2, @gf:=id, @gf:=CONCAT('group_',refer_id)) as group_field, 
    count(*) as total,
    -- 窗口函数直接计算整个结果集的行数
    COUNT(*) OVER() as totalCount
FROM myTable 
GROUP BY group_field 
ORDER BY id asc;

逻辑说明:

COUNT(*) OVER()是窗口函数的常用用法,它会忽略GROUP BY的分组影响,直接计算整个查询结果的总行数,并将这个数值填充到每一行的totalCount字段中。

这两种方法都能满足你的需求,且都没有使用UNION ALL,你可以根据自己的MySQL版本选择合适的方案。

内容的提问来源于stack exchange,提问作者DeLe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 03:44:39