SQL 分群+篩選語法 列出買下所有產品的客人 Leetcode #1045

閱讀時間約 4 分鐘

題目敘述

題目會給我們兩張資料表。

第一張是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。


演算法-分群 結合 子查詢subquery

這題主要的考點落在分群,可以使用經典的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);

Subquery教學

最後,整個串在一起,就是完整的解答程式碼。


程式碼 分群 結合 子查詢subquery

 # 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

avatar-img
88會員
425內容數
由有業界實戰經驗的演算法工程師, 手把手教你建立解題的框架, 一步步寫出高效、清晰易懂的解題答案。 著重在讓讀者啟發思考、理解演算法,熟悉常見的演算法模板。 深入淺出地介紹題目背後所使用的演算法意義,融會貫通演算法與資料結構的應用。 在幾個經典的題目融入一道題目的多種解法,或者同一招解不同的題目,擴展廣度,並加深印象。
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
題目敘述 題目會給我們一張Courses資料表,裡面分別有student、class等欄位。其中(student, class) 是這張資料表的複合主鍵Primary key pair。 要求我們,以課程做分群,列出至少有五位同學的課程。 輸出的順序不拘。 Table: Courses
題目敘述 題目會給我們兩張資料表,第一張是Sales,第二張是Product。 第一張是Sales表格,裡面分別有sale_id、 product_id、year、quantity、price等欄位。其中(sale_id、 product_id)做為複合主鍵Primary key
題目敘述 題目會給我們一張Activity資料表,裡面分別有user_id、 session_id、activity_date 、activity_type等欄位。 要求我們列出所有過去30天的活躍使用者。 活躍使用者的定義為2019-07-27包含這天,往前三十天的區間內,至少有過一次活動紀錄
題目敘述 題目會給我們一張World資料表,裡面分別有name、 continent、area、population 、gdp等欄位,其中name 是主鍵Primary Key。 要求我們列出所有大型國家,大型國家的定義是 人口大於等於兩千五百萬人 或者 土地面積大於等於三百萬平方公里。 輸出順
題目敘述 題目會給我們一張Cinema資料表,裡面分別有id、movie、description, rating 等欄位,其中id 是主鍵Primary Key。 要求我們列出所有推薦人ID為奇數,而且不無聊的電影,印出時依照電影rating評分從高到低降序排列。 Table: Cinema
題目敘述 題目會給我們一張Customer資料表,裡面分別有id、name、referee_id 等欄位,其中id 是主鍵Primary Key。 要求我們列出所有推薦人ID referee_id不等於2的顧客,印出順序不拘。
題目敘述 題目會給我們一張Courses資料表,裡面分別有student、class等欄位。其中(student, class) 是這張資料表的複合主鍵Primary key pair。 要求我們,以課程做分群,列出至少有五位同學的課程。 輸出的順序不拘。 Table: Courses
題目敘述 題目會給我們兩張資料表,第一張是Sales,第二張是Product。 第一張是Sales表格,裡面分別有sale_id、 product_id、year、quantity、price等欄位。其中(sale_id、 product_id)做為複合主鍵Primary key
題目敘述 題目會給我們一張Activity資料表,裡面分別有user_id、 session_id、activity_date 、activity_type等欄位。 要求我們列出所有過去30天的活躍使用者。 活躍使用者的定義為2019-07-27包含這天,往前三十天的區間內,至少有過一次活動紀錄
題目敘述 題目會給我們一張World資料表,裡面分別有name、 continent、area、population 、gdp等欄位,其中name 是主鍵Primary Key。 要求我們列出所有大型國家,大型國家的定義是 人口大於等於兩千五百萬人 或者 土地面積大於等於三百萬平方公里。 輸出順
題目敘述 題目會給我們一張Cinema資料表,裡面分別有id、movie、description, rating 等欄位,其中id 是主鍵Primary Key。 要求我們列出所有推薦人ID為奇數,而且不無聊的電影,印出時依照電影rating評分從高到低降序排列。 Table: Cinema
題目敘述 題目會給我們一張Customer資料表,裡面分別有id、name、referee_id 等欄位,其中id 是主鍵Primary Key。 要求我們列出所有推薦人ID referee_id不等於2的顧客,印出順序不拘。
你可能也想看
Google News 追蹤
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
SQL 是一種專門用來和資料庫進行溝通的程式語言,它讓我們能夠創建資料表、新增、查詢、修改和刪除資料庫中的資料,本文將介紹基本的創建、新增、查詢、修改和刪除的 SQL 語法。
Thumbnail
在SQL Server中,暫存表(Temporary Table)是一種在連線會話期間存在的臨時表格,它可以用來暫存中間結果或臨時資料。本文將介紹如何使用T-SQL語法在SQL Server中建立暫存表。
Thumbnail
在資料庫管理中,SQL(Structured Query Language)是一種強大的工具,用於處理資料庫中的資料。本篇教學將介紹 SQL 中的基本操作,包括 SELECT、UPDATE、INSERT 和 DELETE,讓您能夠有效地查詢、更新、插入和刪除資料。
Thumbnail
我帶著敬畏的心去請教直屬主管,看有沒有讓自己進步的好辦法。結果直屬主管跟我說了這句話,霸氣外露的一句話讓我印象極為深刻,請教結束後主管還出了一門作業「SQL 轉置」,並特別交代我說:「你只要把這個技術學會就會變強」。
今天寫程式連結資料庫,遇見這樣的錯誤 環境 .NET Core 6 / VS 2022 解決方法:DB連結字串 ConnectionString 需要額外加上 TrustServerCertificate=true。不然會出現錯誤 以 appsettings.json 設定檔為例
Thumbnail
假如你開發了一個網站,有user登入的功能,駭客故意輸入SQL語法來破壞原本的SQL結構,這就是SQL注入攻擊。
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
SQL 是一種專門用來和資料庫進行溝通的程式語言,它讓我們能夠創建資料表、新增、查詢、修改和刪除資料庫中的資料,本文將介紹基本的創建、新增、查詢、修改和刪除的 SQL 語法。
Thumbnail
在SQL Server中,暫存表(Temporary Table)是一種在連線會話期間存在的臨時表格,它可以用來暫存中間結果或臨時資料。本文將介紹如何使用T-SQL語法在SQL Server中建立暫存表。
Thumbnail
在資料庫管理中,SQL(Structured Query Language)是一種強大的工具,用於處理資料庫中的資料。本篇教學將介紹 SQL 中的基本操作,包括 SELECT、UPDATE、INSERT 和 DELETE,讓您能夠有效地查詢、更新、插入和刪除資料。
Thumbnail
我帶著敬畏的心去請教直屬主管,看有沒有讓自己進步的好辦法。結果直屬主管跟我說了這句話,霸氣外露的一句話讓我印象極為深刻,請教結束後主管還出了一門作業「SQL 轉置」,並特別交代我說:「你只要把這個技術學會就會變強」。
今天寫程式連結資料庫,遇見這樣的錯誤 環境 .NET Core 6 / VS 2022 解決方法:DB連結字串 ConnectionString 需要額外加上 TrustServerCertificate=true。不然會出現錯誤 以 appsettings.json 設定檔為例
Thumbnail
假如你開發了一個網站,有user登入的功能,駭客故意輸入SQL語法來破壞原本的SQL結構,這就是SQL注入攻擊。