簡體   English   中英

MySQL查詢->在子表中查找具有兩個條件的記錄

[英]MySQL Query -> Finding a record with two conditions in child table

我有兩個簡單的數據庫:

顧客:

+----+--------------------------+
| id |           customer       |
+----+--------------------------+
|  1 | Dent, Arthur             |
|  2 | Prefect, Ford            |
|  3 | Beeblebrox, Zaphod       |
+----+--------------------------+

購買:

+-------------+--------------------------+
| Customer ID |  SKU       |  Date       |
+-------------+--------------------------+
|     1       | PRODUCT1   | 2016-01-16  |
|     1       | PRODUCT3   | 2016-01-18  |
|     2       | PRODUCT2   | 2015-12-12  |
|     2       | PRODUCT1   | 2016-02-10  |
|     3       | PRODUCT3   | 2016-03-01  |
+-------------+------------+-------------+

我想做的是構造一個查詢,該查詢返回已購買PRODUCT1和PRODUCT3的所有客戶(因此在上面的示例中,應該只是Arthur Dent)。

我可以輕松地選擇一種產品; 例如

SELECT `Customer ID` FROM `Customers` a LEFT JOIN `Purchases` b 
ON a.`Customer ID` = b.`Customer ID` WHERE `SKU`=`PRODUCT1'

...但是我不知道如何僅在“客戶”中選擇“采購”中有匹配兩個SKU的相應記錄的記錄?

有兩種不同的方法可以做到這一點。 一種是使用聚合,另一種是多次joinpurchases表:

select c.customer
from customer c
   join purchases p1 on c.id = p1.customerid and p1.sku = 'PRODUCT1'
   join purchases p2 on c.id = p2.customerid and p2.sku = 'PRODUCT3'

根據您的資料,您可能需要使用distinct這種消除重復。


這是聚合的替代方法:

select c.customer
from customer c
where exists (
   select 1
   from purchases p
   where sku in ('PRODUCT1','PRODUCT2')
       and c.id = p.customerid
   having count(distinct sku) = 2
)

您可以通過幾個exists子句來做到這一點,例如:

select c.id, c.customer
from customer 
where exists (
 select customer_id from purchases 
 where customer_id = c.id and sku = 'PRODUCT1'
)
and exists(
 select customer_id from purchases 
 where customer_id = c.id and sku = 'PRODUCT3'
);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM