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 。
思路
- 首先我们要统计Product表中的product_key记录总共的产品数量,然后和Customer表做连接。
- 按customer_id做group by,然后看他们买的产品的计数(要去重)是否是总共的产品数量,因为having内必须用聚合函数,且产品总数都一样,所以取min或max都可以。
代码实现
# Write your MySQL query statement below
select c.customer_id
from Customer c
join (select count(product_key) as product_sum from Product) as p
group by c.customer_id
having count(distinct c.product_key)=max(p.product_sum)
官方题解
- 如果提取的信息是聚合函数的结果,那么可能可以作为值来用。
- 复现:
-
# Write your MySQL query statement below select c.customer_id from Customer c group by c.customer_id having count(distinct c.product_key) = (select count(*) from Product)
-
不过怀疑比较每条数据的时候都重新建表了,所以时间开销比我的实现要高。