2016-03-07 49 views
2

我有两个简单的数据库:MySQL查询 - >查找与子表中两个条件的记录

客户:

+----+--------------------------+ 
| 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的所有客户(在示例中,所以这样做)以上,那应该是亚瑟登特)。

我可以轻松选择一种产品;例如

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

...但我无法弄清楚如何只在“客户”那里有相应的匹配两种型号是“购买”记录选择记录?

回答

0

有几种不同的方法可以做到这一点。一种是使用聚合,一个是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 
) 
+0

好极了,第一个建议很好做的工作。非常感谢你的帮助。 – Andy

0

您可以通过几个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' 
);