【无标题】

题目:

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。

返回结果表 无顺序要求 。

解题:

这里的题眼应该是“购买了所有产品”。

如何表明是所有产品呢?

我的思路一开始是消费者他的product_key ,不能有不在product 里的情况。但后来发现这个思路我写不出。

所以还是换了思路,将数据按customer_id分组后找出,该用户的product_key数量和product表的product_key数量一致的

select distinct m.customer_id from  (select c.customer_id ,count(distinct c.product_key) from Customer c  group by c.customer_id having count(distinct c.product_key) = (select count(distinct product_key) from Product)) m

 我们看看其他人是怎么解决“全部”覆盖的问题的?

好像也是这样的。。

额外收获:

在group by分组的时候,其实我们一般都是以用户为条件,然后count(xx)去计数。要注意,如果select里写了2个列,但是分组的时候只写了一个列,就会导致数据丢失。(但一般mysql里会组织这种情况的出现。)

 【无标题】_第1张图片

这样查出来 的才是对的:

【无标题】_第2张图片

 

你可能感兴趣的:(数据库,sql,mysql)