Получить людей, которые находятся в обоих сетах
У меня есть вопрос, который я не знаю, как правильно задать вопрос, поэтому я начну с инструкции SQL (Postgres):
SELECT pc.person_id
FROM groups g
LEFT OUTER JOIN group_clubs gc ON (gc.group_id = g.id)
LEFT OUTER JOIN person_club pc ON (gc.club_id = pc.club_id)
WHERE g.id = 2
Что у меня есть: группа, которая имеет критерии с клубом, пользователь должен быть в. Это разделено на groups
стол, group_clubs
стол и person_club
Таблица
Чего я хочу: я хочу, чтобы все люди, которые находятся во ВСЕХ клубах, подключались к этой группе. Что я получаю: я получаю всех людей, которые хотя бы в одном из клубов.
Я застрял и понятия не имел, как получить результат, только мне нужно пересечь результаты, но я не знаю, как это сделать сейчас...?!?
РЕДАКТИРОВАТЬ: Чтобы объяснить, что я ищу, вот заявление, которое делает то же самое:
SELECT pc.person_id
FROM person_club pc
WHERE pc.club_id IN (
SELECT gc.club_id
FROM group_clubs gc
WHERE gc.group_id = 2
);
Что я хочу это:
SELECT pc.person_id
FROM person_club pc
WHERE pc.club_id IN ALL(
SELECT gc.club_id
FROM group_clubs gc
WHERE gc.group_id = 2
);
Человек должен быть ВСЕ из group_clubs, перечисленных в этом заявлении!
2 ответа
Я получил ответ благодаря коллеге:
SELECT pc.person_id
FROM person_club_data pc
INNER JOIN group_clubs gc ON (gc.club_id = pc.club_id)
WHERE gc.group_id = 2
GROUP BY pc.person_id
HAVING COUNT(pc.person_id) >= (
SELECT COUNT(gc.club_id)
FROM group_clubs gc2
WHERE gc2.group_id = 2
)
Я выбираю людей, и людей, которые встречаются точно так же часто, как строки group_clubs, можно найти для группы 2 и которые связаны с этой группой.
Попробуй это:
SELECT pc.person_id
FROM groups g
INNER JOIN group_clubs gc ON (gc.group_id = g.id)
INNER JOIN person_club pc ON (gc.club_id = pc.club_id)
WHERE g.id = 2
Я не думаю, что вам нужна последняя строка (предложение WHERE), если вы не хотели просто получить одного человека.