2014-09-19 3 views
1

Предположим, у меня есть эти две таблицы:Фильтр MySQL по столбцу в нескольких строках?

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

Я необходимости фильтровать мой результат, установленный несколькими ItemNames. Скажем, я хочу вернуть всех Клиентов, которые находятся в возрасте от 18 до 24 лет, которые купили «камеру» и «телефон». Я могу выполнить следующий запрос, чтобы получить все записи для клиентов между возрастным диапазоном:

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

Однако, когда приходит время для фильтрации на колонке ITEMNAME в таблице Приобретения, как это делает один фильтр на нескольких строках? Предположим, что это возможно без нескольких запросов?

ответ

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 (отличное ItemName) = 2 , это пропустит клиент, который купил камеру и телефон, а также другие предметы? – commanderZiltoid

+0

Но в предложении 'where' вы смотрите только' AND ItemName IN ('camera', 'phone') '. Так что неважно, есть ли другие –

+0

Вы, безусловно, правы. Работает как шарм! – commanderZiltoid

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 из группы по этому утверждению .. – Rafay

+0

Когда запись добавляется в таблицу покупок для Cust3 с ItemName = 'phone', тогда Cust3 также отображается в результатах, даже если они не купили камеру ' – commanderZiltoid

Смежные вопросы