Мysql запросом?

Вот случился такой случай, еслть таблица с пользователями:


таблица members
idname
1User1
2User2
3User3
4User4



пользователь может иметь несколько групп, есть таблица связей


таблица members_teams
idmember_idteam_id
111
212
322
433
531



Задача: Выбрать всех пользователей которые не состоят в группе, например team_id = 1


Сразу пришло решение
SELECT * FROM Members WHERE id NOT IN (SELECT id FROM members_teams WHERE team_id = 1)



Но мне мне кажется при больших количествах пользователей это совсем не годится, возможно есть какой то другой вариант для решения этой задачи.
  • Вопрос задан
  • 2637 просмотров
Решения вопроса 1
Melkij
@Melkij
PostgreSQL DBA
Зачем в таблице-связке поле id?

SELECT Members.* FROM Members LEFT JOIN members_teams ON Members.id = members_teams.member_id and team_id = 1 where members_teams.member_id is null
Ответ написан
Пригласить эксперта
Ответы на вопрос 7
colonel
@colonel
Разработчик PHP, Laravel
member — не пользователь, team — не группа
Ответ написан
Комментировать
blare
@blare
SELECT m.id 
FROM members m
LEFT JOIN members_teams mt ON m.id = mt.member_id and mt.team_id = 1
WHERE mt.team_id is null
Ответ написан
stanishevsky
@stanishevsky
Я бы использовал OUTER JOIN, потому что пользователь, который ни в одной группе не состоит, удовлетворяет требованию «Не состоит в группе 1», однако с иннер джойном эти пользователи вообще не выдадутся.
Ответ написан
Комментировать
ertaquo
@ertaquo
Лучше использовать JOIN. Как-то так:
SELECT Members.* FROM Members LEFT JOIN members_teams ON Members.id = members_teams.member_id WHERE team_id <> 1
Ответ написан
select members.id, members.name from members
inner join members_teams on members.id = members_teams.member_id
where members_teams.team_id  NOT IN (1)


На скорую руку, в общем смысл использовать оператор JOIN
Ответ написан
blare
@blare
SELECT m.id FROM members m LEFT JOIN members_teams mt ON m.id = mt.member_id and mt.team_id = 1 WHERE mt.team_id is null
Ответ написан
Комментировать
SELECT m.id, sum(CASE mt.team_id = 1 WHEN TRUE THEN 1 ELSE 0 END) as in_team FROM members m LEFT JOIN members_teams mt ON mt.member_id = m.id GROUP BY m.id
этот запрос выдаст таблицу всех пользователей, и для каждого будет указано in_team (0 — не состоит в группе, 1 — состоит)
используй его как подзапрос
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы