如何查询同时订购全部指定产品(01、03、05)的用户?
筛选同时订购多款指定产品的用户解决方案
下面提供几种实用的SQL查询方法,帮你找出同时订购了01、03、05三款产品的用户:
方法一:GROUP BY + HAVING 子句(最常用)
先筛选出涉及目标产品的订单记录,再按用户分组,通过统计用户订购的不同产品数量来判断是否满足条件。
SELECT user_id FROM sales_orders WHERE product IN ('01', '03', '05') GROUP BY user_id HAVING COUNT(DISTINCT product) = 3;
- 加
DISTINCT是为了避免同一用户多次订购同一款产品时计数重复,确保统计的是不同产品的数量。如果你的表中一个用户对同一款产品只会有一条订单记录,也可以去掉DISTINCT。
方法二:多表内连接(JOIN)
通过三次连接订单表,分别匹配每个目标产品的订单,最终只保留同时存在三个匹配结果的用户。
SELECT DISTINCT s1.user_id FROM sales_orders s1 JOIN sales_orders s2 ON s1.user_id = s2.user_id JOIN sales_orders s3 ON s1.user_id = s3.user_id WHERE s1.product = '01' AND s2.product = '03' AND s3.product = '05';
DISTINCT用于去重,避免同一个用户因为多笔订单被多次返回。
方法三:EXISTS 子查询
逐个检查用户是否存在每款目标产品的订单记录,只有三个条件都满足的用户才会被选中。
SELECT DISTINCT user_id FROM sales_orders s WHERE EXISTS (SELECT 1 FROM sales_orders WHERE user_id = s.user_id AND product = '01') AND EXISTS (SELECT 1 FROM sales_orders WHERE user_id = s.user_id AND product = '03') AND EXISTS (SELECT 1 FROM sales_orders WHERE user_id = s.user_id AND product = '05');
- 这种方法逻辑直观,适合产品数量不多的场景,每增加一款产品就多一个
EXISTS条件即可。
内容的提问来源于stack exchange,提问作者Lila C
相关产品推荐
相关产品推荐

