题目:
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里会组织这种情况的出现。)
这样查出来 的才是对的: