MySQL GROUP BY分组后如何高效实现多区间条件聚合最小值计算
MySQL分组多区间价格统计高效实现方案
不需要编写大量重复子查询,也不需要做多次JOIN关联,直接用条件聚合即可实现需求,该方案仅需单次扫描数据表,是所有实现方式中性能最高的,新增统计区间仅需追加一行规则即可,维护成本极低。
核心写法如下,完全匹配你预期的查询逻辑:
SELECT parent_id, MIN(price) AS min_price, MIN(CASE WHEN price > 50 THEN price END) AS p_50, MIN(CASE WHEN price > 100 THEN price END) AS p_100, -- 后续新增价格区间按相同格式追加即可 MIN(CASE WHEN price > 200 THEN price END) AS p_200, MIN(CASE WHEN price > 500 THEN price END) AS p_500 FROM price_table GROUP BY parent_id;
实现原理
- 当价格满足区间判断条件时,
CASE WHEN返回对应的price值,不满足条件时默认返回NULL - MySQL的
MIN()聚合函数会自动忽略NULL值,最终计算结果就是对应区间内的最低价格,和你设想的MIN(price WHERE 筛选条件)逻辑完全一致 - 如果某个parent_id下没有符合对应区间的价格,对应字段会返回NULL,若需要自定义默认值,可以在
CASE语句末尾加ELSE 自定义值即可
性能对比
- 条件聚合:仅对数据表做1次扫描,分组计算时同步完成所有区间的统计,区间数量增加不会带来额外的扫描开销
- 关联子查询/多表JOIN:每新增1个统计区间就会新增1次子查询或JOIN关联计算,区间越多性能下降越明显,20个区间的场景下性能差距会非常显著
内容的提问来源于stack exchange,提问作者SoluriX
相关产品推荐
相关产品推荐

