Реляционное деление: точное деление
Я столкнулся со следующей проблемой:
Напишите запрос, чтобы найти пользователей с такими же друзьями, как у другого пользователя U.
Вот таблицы (и SQL-скрипка: http://sqlfiddle.com/):
- Пользователи:
- user_id: Int
- Дружеские:
- user_id: Int
- friend_id: Int
Проблема, связанная с моим запросом, заключается в том, что он возвращает пользователей, которые имеют таких же друзей или больше, чем пользователь U.
SELECT *
FROM users INNER JOIN friendships ON users.id = friendships.user_id
WHERE users.id != 1 AND friendships.friend_id IN (
SELECT DISTINCT friendships.friend_id
FROM friendships
WHERE friendships.user_id = 1
)
GROUP BY users.id
HAVING COUNT(DISTINCT friendships.friend_id) = (
SELECT COUNT(DISTINCT friendships.friend_id)
FROM friendships
WHERE friendships.user_id = 1
);
1 ответ
Решение
Самый простой способ - собрать друзей и затем сравнить:
with f as (
select user_id, array_agg(friend_id order by friend_id) as friends
from friendships f
group by user_id
)
select user_id
from f
where f.friends = (select friends from f where user_id = 1) and
f.user_id <> 1;