題目會給我們兩張資料表。
第一張是Customer資料表,裡面分別有customer_id 、product_key 等欄位。其中product_key 是這張資料表的外鍵foreign key,關連到第二張Product資料表。
題目還特別提醒,這張資料表可能包含重複的data row。
第二張是Product資料表,裡面有product_key 這個欄位。
要求我們,列出那些買下所有產品的的客人ID。
輸出的順序不拘。
Table: Customer
+-------------+---------+
| Column Name | Type |
+-------------+---------+
| customer_id | int |
| product_key | int |
+-------------+---------+
This table may contain duplicates rows.
customer_id is not NULL.
product_key is a foreign key (reference column) to Product table.
Table: Product
+-------------+---------+
| Column Name | Type |
+-------------+---------+
| product_key | int |
+-------------+---------+
product_key is the primary key (column with unique values) for this table.
題目還特別提醒,Customer
這張資料表可能包含重複的data row。
要求我們,列出那些買下所有產品的的客人ID。
這題主要的考點落在分群,可以使用經典的SQL 分群語法去解開
SELECT ...欄位
FROM ...表格
GROUP BY ...分群的依據欄位
HAVING ...過濾的條件
主角是客人,所以先用客人customer_id作為分群的依據欄位
SELECT DISTINCT c.customer_id
FROM Customer c
GROUP BY c.customer_id
過濾的條件是買下所有的產品,這邊可以搭配subquery的語法找出來。
這邊要特別留意,題目有說可能包含重複的Data row,所以要記得加上DISTINCT 關鍵字 去排除重複的資料。
HAVING COUNT(DISTINCT c.product_key ) = (SELECT COUNT(*) FROM Product);
最後,整個串在一起,就是完整的解答程式碼。
# Write your MySQL query statement below
SELECT DISTINCT c.customer_id
FROM Customer c
GROUP BY c.customer_id
# Select those customers who have all unique product count.
HAVING COUNT(DISTINCT c.product_key ) = (SELECT COUNT(*) FROM Product);
看到分群 想到GROUP BY ... HAVING ...條件的語法。
可以同步複習 SQL分群語法 列出活躍使用者 Leetcode #1141這一題,鞏固分群GROUP BY的語法和知識點。
另外,當覺得一步到位很難的時候,可以先拆成臨時表,再從臨時表裡面去查詢撈資料)
可以同步複習 SQL子查詢語法 產品銷售分析III Leetcode #1070 ,和
SQL 分群語法 列出至少有五位學生的課程 Leetcode #596 這兩題,鞏固子查詢的語法和知識點。
Reference:
[1] MySQL with GRUOP BY ... HAVING ... condition syntax - Customers Who All Products - LeetCode