优化SQL查询:如何去掉冗长GROUP BY 无需JOIN获取GROUP_CONCAT聚合值
避免冗长GROUP BY的SQL实现方案
完全可以通过子查询实现和原写法一致的聚合效果,不需要关联后再全字段GROUP BY,常用的有两种实现方式:
方案1:SELECT列表关联子查询
直接在主查询的字段列表中嵌入子查询,对每一行主表数据单独计算从表的聚合值,主表需要查询的字段可以直接追加,不需要额外配置GROUP BY:
SELECT user.id, user.name, user.type, -- 其他user表字段可直接在此处添加 (SELECT GROUP_CONCAT(car.id SEPARATOR ', ') FROM car WHERE car.userid = user.id) AS cars FROM user -- 若仅需返回有对应车辆的用户,保留该行,否则可删除 WHERE EXISTS (SELECT 1 FROM car WHERE car.userid = user.id) ORDER BY user.name, user.type, cars;
方案2:CTE预聚合从表后关联
如果使用的数据库支持公共表表达式(CTE,MySQL8+、PostgreSQL、SQL Server等主流数据库均支持),可以先单独完成从表的聚合计算,再和主表关联,数据量较大时性能表现更稳定:
WITH car_agg AS ( SELECT userid, GROUP_CONCAT(id SEPARATOR ', ') AS cars FROM car GROUP BY userid ) SELECT user.id, user.name, user.type, -- 其他user表字段可直接在此处添加 car_agg.cars FROM user INNER JOIN car_agg ON user.id = car_agg.userid ORDER BY user.name, user.type, cars;
两种方案返回的聚合结果和原JOIN+全字段GROUP BY的写法完全一致,且兼容开启了ONLY_FULL_GROUP_BY模式的MySQL环境,不会触发语法报错。
内容的提问来源于stack exchange,提问作者sita3021
相关产品推荐
相关产品推荐

