簡體   English   中英

sql-查找所有用戶共有的項目

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM