2016-02-23 3 views
2

я могу найти элементы, общих между двумя данными пользователей по аналогии с ответом here:SQL - найти элементы, которые все пользователи имеют в общих

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

Я думаю, я мог бы продолжать добавлять более пересекаются заявления для включения дополнительных пользователей и это вряд ли хорошее решение. Как я могу найти все и все элементы, общие для ВСЕХ пользователей? В моем, например, обычным явлением среди всех пользователей является «ПК», но это может быть и любой другой элемент (ы). . Благодарю.

ответ

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

Вы можете попробовать что-то вроде этого:

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) 

Идея заключается в том, чтобы взять количество элемента из вашего запроса, и сравнить его к общему количеству пользователей. Если его равно, то это означает, что все пользователи имеют его.

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) 
Смежные вопросы