题目描述

(通过次数15,259 | 提交次数24,050,通过率63.45%)

Customer表:
+-------------+---------+
| Column Name | Type    |
+-------------+---------+
| customer_id | int     |
| product_key | int     |
+-------------+---------+
product_key 是 Customer 表的外键。

Product表:
+-------------+---------+
| Column Name | Type    |
+-------------+---------+
| product_key | int     |
+-------------+---------+
product_key 是这张表的主键。

写一条 SQL 查询语句,从 Customer 表中查询购买了 Product 表中所有产品的客户的 id。
示例:
Customer 表:
+-------------+-------------+
| customer_id | product_key |
+-------------+-------------+
| 1           | 5           |
| 2           | 6           |
| 3           | 5           |
| 3           | 6           |
| 1           | 6           |
+-------------+-------------+

Product 表:
+-------------+
| product_key |
+-------------+
| 5           |
| 6           |
+-------------+

Result 表:
+-------------+
| customer_id |
+-------------+
| 1           |
| 3           |
+-------------+
购买了所有产品(5 和 6)的客户的 id 是 1 和 3 。

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/customers-who-bought-all-products
//测试数据

#测试数据
Create table If Not Exists Customer (customer_id int, product_key int);
Create table If Not Exists Product (product_key int);

insert into Customer (customer_id, product_key) values ('1', '5');
insert into Customer (customer_id, product_key) values ('2', '6');
insert into Customer (customer_id, product_key) values ('3', '5');
insert into Customer (customer_id, product_key) values ('3', '6');
insert into Customer (customer_id, product_key) values ('1', '6');

insert into Product (product_key) values ('5');
insert into Product (product_key) values ('6');

解题思路

Customer表保存了所有客户的购买记录。一个客户可以购买多个产品,也可以同一产品购买多次。
Product表保存了所有的产品信息。
题目要求,计算出购买了所有产品的客户。
首先,需要知道每个客户购买的产品数。可以从Customer表中分组汇总得出。因为同一个客户可以购买同一个产品多次,因为在计数时,需要先对product_key去重。
然后,需要知道总的产品数。直接对Product表做全表的COUNT即可。
最后,将每个客户购买的产品数与总的产品数相比较。相等的即为购买了所有产品的客户。

参考SQL

未特别说明的情况下,参考SQL为基于MySQL8.0实现。
select customer_id
from Customer
group by customer_id
having count(distinct product_key) = 
    (select count(1) from Product);
picture loss