sql - 查找所有用户共有的项目

时间:2016-02-23 14:22:12

标签: sql sqlite

我可以找到两个给定用户之间共同的项目,类似于答案here

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”,但它也可以是任何其他项目。 See my code on SQL Fiddle。感谢。

3 个答案:

答案 0 :(得分:2)

您可以尝试这样的事情:

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)

我们的想法是从您的查询中获取项目的计数,并将其与用户总数进行比较。如果它等于那么意味着所有用户都拥有它。

答案 1 :(得分:1)

要获得这些物品,您可以这样做:

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);

答案 2 :(得分:0)

这是与@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)