原题链接:http://practice.atguigu.cn/#/question/18/desc?qType=SQL
题目需求
从订单明细表(order_detail)中查询出所有购买过商品1和商品2,但是没有购买过商品3的用户,
期望结果如下:
user_id |
---|
103 |
105 |
需要用到的表:
订单信息表:order_info
order_id (订单id) | user_id (用户id) | create_date (下单日期) | total_amount (订单金额) |
---|---|---|---|
1 | 101 | 2021-09-30 | 29000.00 |
10 | 103 | 2020-10-02 | 28000.00 |
订单明细表:order_detail
order_detail_id(订单明细id) | order_id(订单id) | sku_id(商品id) | create_date(下单日期) | price(商品单价) | sku_num(商品件数) |
---|---|---|---|---|---|
1 | 1 | 1 | 2021-09-30 | 2000.00 | 2 |
2 | 1 | 3 | 2021-09-30 | 5000.00 | 5 |
22 | 10 | 4 | 2020-10-02 | 6000.00 | 1 |
23 | 10 | 5 | 2020-10-02 | 500.00 | 24 |
24 | 10 | 6 | 2020-10-02 | 2000.00 | 5 |
解题思路
- 使用except做集合差
SELECT user_id
FROM order_detail
WHERE sku_id IN (1, 2)
GROUP BY user_id
except
SELECT user_id
FROM order_detail
WHERE sku_id = 3
GROUP BY user_id
- 外连接
SELECT t1.user_id
FROM
(
SELECT oi.user_id,
COUNT(DISTINCT sku_id) AS sku_cnt
FROM order_detail od
JOIN order_info oi
ON od.order_id = oi.order_id
WHERE od.sku_id IN (1, 2)
GROUP BY oi.user_id
) t1
LEFT JOIN
(
SELECT oi.user_id
FROM order_detail od
JOIN order_info oi
ON od.order_id = oi.order_id
WHERE od.sku_id = 3
GROUP BY oi.user_id
) t2
ON t1.user_id = t2.user_id
WHERE t2.user_id IS NULL
AND t1.sku_cnt = 2
- 设计统计值判断
SELECT t1.user_id
FROM
(
SELECT oi.user_id,
COUNT(DISTINCT IF(sku_id IN (1,2),sku_id,NULL)) AS flag_1,
COUNT(DISTINCT IF(sku_id = 3,sku_id,NULL)) AS flag_2
FROM order_detail od
JOIN order_info oi
ON od.order_id = oi.order_id
WHERE od.sku_id IN (1, 2, 3)
GROUP BY oi.user_id
) t1
WHERE flag_1 = 2 AND flag_2 = 0