每日leetcode

发布于:2025-06-13 ⋅ 阅读:(24) ⋅ 点赞:(0)

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 。

思路

  1. 首先我们要统计Product表中的product_key记录总共的产品数量,然后和Customer表做连接。
  2. 按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)
  • 不过怀疑比较每条数据的时候都重新建表了,所以时间开销比我的实现要高。