[英]Advanced Mysql Query to get master record if two conditions matches on different rows of child records
[英]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的相應記錄的記錄?
有兩種不同的方法可以做到這一點。 一種是使用聚合,另一種是多次join
到purchases
表:
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.