大数据SQL题18 购买过商品1和商品2但是没有购买商品3的顾客

文章介绍了如何使用SQL查询从订单明细表中筛选出购买了商品1和2但未购买商品3的用户,提供了三种不同的解题思路:集合差、外连接以及统计值判断。
摘要由CSDN通过智能技术生成

原题链接: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 (订单金额)
11012021-09-3029000.00
101032020-10-0228000.00

订单明细表:order_detail

order_detail_id(订单明细id)order_id(订单id)sku_id(商品id)create_date(下单日期)price(商品单价)sku_num(商品件数)
1112021-09-302000.002
2132021-09-305000.005
221042020-10-026000.001
231052020-10-02500.0024
241062020-10-022000.005

解题思路

  1. 使用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
  1. 外连接
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
  1. 设计统计值判断
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
  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值