2014-09-19 46 views
1

假設我有這兩個表:對多行中的列值進行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 

:我可以運行下面的查詢來獲取所有記錄年齡範圍之間的客戶?假設沒有多個查詢是可能的?

回答

2
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

0

我相信這將會回答你的問題: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