MySQL 8.0以下版本如何替换WITH子句适配年龄统计SQL
MySQL低版本无WITH语法适配改写
由于MySQL 8.0才正式引入WITH公共表表达式(CTE)支持,5.x及更早版本的兼容改写逻辑非常直接:把原本定义在WITH里的临时结果集,直接替换为FROM子句下的派生表,核心统计逻辑完全不需要改动。
可直接执行的改写后SQL
SELECT COUNT(CASE WHEN age BETWEEN 0 AND 24 THEN 1 END) AS age_00_24_cnt, COUNT(CASE WHEN age BETWEEN 25 AND 34 THEN 1 END) AS age_25_34_cnt, COUNT(CASE WHEN age BETWEEN 35 AND 44 THEN 1 END) AS age_35_44_cnt, COUNT(CASE WHEN age BETWEEN 45 AND 54 THEN 1 END) AS age_45_54_cnt, COUNT(CASE WHEN age >= 55 THEN 1 END) AS age_55_xx_cnt FROM ( SELECT ROUND(DATEDIFF(CAST(CURRENT_TIMESTAMP() AS DATE), CAST(dob AS DATE)) / 365, 0) AS age FROM artisan_bio ) AS ages
注意事项
- 派生表必须显式指定别名(上述代码里的
AS ages),这是MySQL低版本的强制语法要求,漏写会直接触发语法报错 - 原SQL用到的类型转换、日期计算、聚合统计函数均在MySQL 5.1及以上版本原生支持,不需要额外调整计算逻辑
- 如果
artisan_bio表数据量在百万级以上,也可以把年龄计算逻辑直接塞到主查询的CASE判断里,去掉派生表嵌套,能减少一次临时结果集的扫描,优化查询速度
内容的提问来源于stack exchange,提问作者Husnain Yusufi
相关产品推荐
相关产品推荐

