MySQL中如何按年份筛选符合特定订单数条件的邮箱记录
解决按年份订单数筛选邮箱的SQL方案
要实现你需要的按年份订单数筛选邮箱的需求,核心思路是按邮箱分组后,用条件聚合统计各年份订单数,再通过HAVING子句过滤符合条件的分组。你的伪SQL问题在于直接在WHERE里用聚合函数,这不符合SQL执行逻辑——聚合函数需要先分组才能计算,所以得用GROUP BY + HAVING的组合。
正确的SQL写法
SELECT email FROM orders -- 可选:如果表中有其他年份数据,先过滤掉无关年份可以提升性能 WHERE year IN (2000, 2001, 2002) GROUP BY email HAVING -- 统计2000年订单数等于1 SUM(CASE WHEN year = 2000 THEN 1 ELSE 0 END) = 1 -- 统计2001年订单数≤5 AND SUM(CASE WHEN year = 2001 THEN 1 ELSE 0 END) <= 5 -- 统计2002年订单数等于3 AND SUM(CASE WHEN year = 2002 THEN 1 ELSE 0 END) = 3;
写法说明
GROUP BY email:将订单按邮箱分组,确保每个分组对应一个用户的所有订单。SUM(CASE ...):通过CASE语句标记目标年份的订单,再用SUM统计该年份的订单总数(也可以用COUNT(CASE WHEN year=2000 THEN 1 END),效果一致)。HAVING:在分组聚合完成后,过滤出满足各年份订单数条件的邮箱。
补充简化写法(部分数据库支持)
如果你的数据库支持FILTER子句(比如PostgreSQL),可以用更简洁的语法实现:
SELECT email FROM orders WHERE year IN (2000, 2001, 2002) GROUP BY email HAVING COUNT(*) FILTER (WHERE year = 2000) = 1 AND COUNT(*) FILTER (WHERE year = 2001) <= 5 AND COUNT(*) FILTER (WHERE year = 2002) = 3;
内容的提问来源于stack exchange,提问作者user20015767
相关产品推荐
相关产品推荐

