我可以找到两个给定用户之间共同的项目,类似于答案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。感谢。
答案 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)