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;
逻辑说明:
- 内层
temp子查询和原查询的分组逻辑完全对齐,用来计算最终生成的分组总数(也就是8); - 通过
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
相关产品推荐
相关产品推荐

