我有以下表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'
謝謝
我有以下表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'
謝謝
這是一個set-set-set查詢的例子。解決這個靈活的方法是使用group by
和having
:
select userid
from purchases
where name in ('apple', 'pear', 'banana')
group by userid
having count(*) = 3;
要獲取的名字,你會加入在Users
表。
如果與樣本數據不同,表中允許有重複項,則在having
子句中使用count(distinct name) = 3
。
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);
,如果你只尋找那些具體項目這是行不通的。如果還有其他物品可以購買,而您只是在尋找購買這些特定物品的用戶,那麼您需要做一些類似於戈登的物品,並對物品的購買次數進行更正。
您可以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;
有可能是用戶已經購買了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;
是的,但如果一個人多次購買,則計數將提供虛假匹配。例如,如果用戶'2'購買了另一個'梨',他的計數爲3,即使他只買了兩件。因此,你希望在某處有一個'distinct',或者另一個'select * from purchase group by userid,name' – vol7ron