一、数据
1045. 买下所有产品的客户 - 力扣(LeetCode)
Customer
表:
+-------------+---------+ | Column Name | Type | +-------------+---------+ | customer_id | int | | product_key | int | +-------------+---------+ 该表可能包含重复的行。 customer_id 不为 NULL。 product_key 是 Product 表的外键(reference 列)。
Product
表:
+-------------+---------+ | Column Name | Type | +-------------+---------+ | product_key | int | +-------------+---------+ product_key 是这张表的主键(具有唯一值的列)。
编写解决方案,报告 Customer
表中购买了 Product
表中所有产品的客户的 id。
返回结果表 无顺序要求 。
返回结果格式如下所示。
示例 1:
输入: Customer 表: +-------------+-------------+ | customer_id | product_key | +-------------+-------------+ | 1 | 5 | | 2 | 6 | | 3 | 5 | | 3 | 6 | | 1 | 6 | +-------------+-------------+ Product 表: +-------------+ | product_key | +-------------+ | 5 | | 6 | +-------------+ 输出: +-------------+ | customer_id | +-------------+ | 1 | | 3 | +-------------+ 解释: 购买了所有产品(5 和 6)的客户的 id 是 1 和 3 。
二、分析
要计算购买了所有产品的用户id,我们从Product
表中可以计算出一共有多少种产品,然后在Customer
表按用户id进行分组,分别计算出每个用户购买的商品的数量,因为Product
表可能有重复数据,所以用户可能购买了多次同样的商品,所以需要使用distinct关键字求出每个用户购买不同商品的数量,然后与Product
表中的产品数量进行对比,进而求出答案。
三、代码
SELECT customer_id
FROM Customer
GROUP BY customer_id
HAVING COUNT(DISTINCT product_key) = --按用户进行分组,求出每个用户购买不同产品的数量
(SELECT COUNT(product_key) -- 用子查询求出一共有多少种产品
FROM product);
四、小结
本题难度不大,主要运用好子查询的用法;踩坑点为:在Customer表中可能有重复数据,即一个用户购买了多次相同的产品,所以需要用distinct语句进行去重,然后再计算出每个用户的购买数量。
标签:customer,product,1045,数据库,Product,力扣,key,+-------------+,id From: https://blog.csdn.net/dhdbanwan/article/details/142885135