对多行中的列值进行MySQL过滤?

问题描述:

假设我有这两个表:对多行中的列值进行MySQL过滤?

|Customers  |   |Purchases  | 
----------------   ----------------- 
|CusID   |-----  |PurchaseID  | 
|CusName  |  |---<|CusID   | 
|CusAge  |   |ItemName  | 
|CusDateAdded |   |DatePurchased | 

我需要筛选我的结果由多个itemNames的设置。假设我想退回所有年龄在18岁至24岁之间购买“相机”和“电话”的所有客户。当谈到时间,在采购表中是如何做的多行一个过滤器ITEMNAME列过滤然而

SELECT CusID 
FROM Customers AS C 
JOIN Purchases AS P 
ON C.CusID = P.CusID 
WHERE C.CusAge BETWEEN 18 AND 24 

:我可以运行下面的查询来获取所有记录年龄范围之间的客户?假设没有多个查询是可能的?

SELECT C.CusID 
FROM Customers AS C 
JOIN Purchases AS P ON C.CusID = P.CusID 
WHERE C.CusAge BETWEEN 18 AND 24 
AND ItemName IN ('camera','phone') 
GROUP BY C.CusID 
HAVING count(distinct ItemName) = 2 

集团由客户,并只返回这两个项目。

+0

我可能会看这个错误,请纠正我,如果我是,但如果客户有更多的购买不仅仅是“相机”和'电话'。假设他们还购买了一个'衬衫'和'帽子',这将使他们在采购表中的总记录数等于4.因为我只关心'照相机'和'手机',所以当我运行HAVING count(distinct ItemName)= 2 ,这是否会忽视购买了相机和手机以及其他物品的顾客? – commanderZiltoid 2014-09-19 14:16:54

+0

但是在你的where子句中,你只能看到AND ItemName IN('camera','phone')'。所以没关系,如果有其他人 – 2014-09-19 15:58:59

+0

你肯定是正确的。奇迹般有效! – commanderZiltoid 2014-09-19 17:51:14

我相信这将会回答你的问题:SQL FIDDLE

SELECT C.CustID,C.CustName,P.ItemName 
FROM Customers AS C 
JOIN Purchases AS P ON C.CustID = P.CustID 
GROUP BY C.CustID,C.CustName,P.ItemName 
HAVING P.ItemName IN ('camera','phone') 
+0

你总是可以在这个条件之上放置一个where子句group by statement .. – Rafay 2014-09-19 15:02:24

+0

当记录被添加到为Item3 ='phone'购买Cust3的表时,即使他们没有购买'camera',Cust3也会出现在结果中“ – commanderZiltoid 2014-09-19 15:30:51