2015-11-07 159 views
0

我有以下表SQL LEFT JOIN查詢問題

Users 
ID Name 
1 John Smith 
2 James Jones 
3 Peter Brown 

Purchases 
USERID NAME 
1  Apple 
1  Pear 
1  Banana 
2  Apple 
2  Pear 
3  Apple 

我怎麼能有一個SQL查詢,返回帶來的用戶(蘋果&梨&香蕉)

所以它上面的表格中'John Smith'

謝謝

回答

2

這是一個set-set-set查詢的例子。解決這個靈活的方法是使用group byhaving

select userid 
from purchases 
where name in ('apple', 'pear', 'banana') 
group by userid 
having count(*) = 3; 

要獲取的名字,你會加入在Users表。

如果與樣本數據不同,表中允許有重複項,則在having子句中使用count(distinct name) = 3

+1

是的,但如果一個人多次購買,則計數將提供虛假匹配。例如,如果用戶'2'購買了另一個'梨',他的計數爲3,即使他只買了兩件。因此,你希望在某處有一個'distinct',或者另一個'select * from purchase group by userid,name' – vol7ron

0

SQL Fiddle

SELECT users.name, purchased.items 
FROM users 
INNER JOIN (
    select userid as id, array_agg(distinct name) items 
    from purchases 
    group by userid 
    having array_length(array_agg(distinct name),1)=3 
) purchased USING(id); 

,如果你只尋找那些具體項目這是行不通的。如果還有其他物品可以購買,而您只是在尋找購買這些特定物品的用戶,那麼您需要做一些類似於戈登的物品,並對物品的購買次數進行更正。

1

您可以JOIN表和COUNT產品:

SELECT u.Name 
FROM Purchases p 
JOIN Users u 
    ON p.UserID = u.ID 
WHERE p.Name IN ('Apple', 'Pear', 'Banana') 
GROUP BY userid 
HAVING COUNT(DISTINCT p.Name) = 3; 

SqlFiddleDemo

有可能是用戶已經購買了2個蘋果和一根香蕉,所以你應該算作不同的產品名稱。

如果您正在使用Postgresql/SQL Server/Oracle你需要用Name與聚合函數:

SELECT MAX(u.Name) AS Name 
FROM Purchases p 
JOIN Users u 
    ON p.UserID = u.ID 
WHERE p.Name IN ('Apple', 'Pear', 'Banana') 
GROUP BY userid 
HAVING COUNT(DISTINCT p.Name) = 3;