[英]sql - find items that ALL users have in common
我可以找到兩個給定用戶之間共有的項目,類似於這里的答案:
SELECT items.name
FROM users
JOIN requests
ON users.user_id = requests.user_id
JOIN items
ON requests.item_id = items.item_id
WHERE users.name = 'jane'
INTERSECT
SELECT items.name
FROM users
JOIN requests
ON users.user_id = requests.user_id
JOIN items
ON requests.item_id = items.item_id
WHERE users.name = 'zaku';
我想我可以繼續添加更多的相交語句以包括其他用戶,這幾乎不是一個好的解決方案。 我如何找到所有用戶共有的所有物品? 在我的例子中,所有用戶之間的共同項是“ pc”,但也可以是任何其他項。 請參閱我在SQL Fiddle上的代碼 。 謝謝。
您可以嘗試如下操作:
SELECT items.name
FROM users
JOIN requests
ON users.user_id = requests.user_id
JOIN items
ON requests.item_id = items.item_id
GROUP BY items.name
having count(items.name) = (select count(distinct user_id) from users)
這個想法是從您的查詢中獲取項目的計數,並將其與用戶總數進行比較。 如果等於,則表示所有用戶都擁有它。
要獲得物品,您可以簡單地執行以下操作:
select r.item_id
from requests r
group by r.item_id
having count(distinct r.user_id) = (select count(*) from users);
獲得名稱本質上是相同的:
select i.name
from requests r join
items i
on r.item_id = i.item_id
group by i.name
having count(distinct r.user_id) = (select count(*) from users);
這與@sagi擊敗我的答案類似。 這種方法的優勢在於它可以為用戶處理重復的item_names
,例如,如果用戶有兩個相同的項目請求,但是,這可能不適用於您的情況:
SELECT item_name
FROM (SELECT users.name AS users_name ,
items.name AS item_name
FROM users
JOIN requests ON users.user_id = requests.user_id
JOIN items ON requests.item_id = items.item_id
GROUP BY users.name ,
items.name
HAVING COUNT(*) > 0
)
GROUP BY item_name
HAVING COUNT(*) = ( SELECT COUNT(distinct user_id) FROM users)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.