#mysql #many-to-many
#mysql #многие ко многим
Вопрос:
У меня следующая проблема. Есть две таблицы — groups
и students
и третья сводная таблица group_student
.
Запрос для получения учащихся из определенных групп (id: 1,8) понятен…
SELECT DISTINCT s.*
FROM students AS s
Inner Join group_student AS gs ON gs.student_id = s.id
Inner Join groups AS g ON g.id = gs.group_id
WHERE g.id IN ("1","8")
Это работает. Но, как сделать запрос, если я хочу выбрать только сегмент студентов с идентификатором группы 1. Например s.name = "john"
. Таким образом, результат должен быть: all students from group id 8 all students with name "john" from group id 1
.
Спасибо за сообщения 🙂
Ответ №1:
Попробуйте это:
SELECT DISTINCT s.*
FROM students AS s
Inner Join group_student AS gs ON gs.student_id = s.id
Inner Join groups AS g ON g.id = gs.group_id
WHERE g.id ="8" or (g.id="1" and s.name = "john")
Комментарии:
1. он будет выбирать один набор данных за один раз, а не оба
Ответ №2:
вы также можете использовать ОБЪЕДИНЕНИЕ
SELECT DISTINCT s.*
FROM students AS s
Inner Join group_student AS gs ON gs.student_id = s.id
Inner Join groups AS g ON g.id = gs.group_id
WHERE g.id = 8
UNION
SELECT DISTINCT s.*
FROM students AS s
Inner Join group_student AS gs ON gs.student_id = s.id
Inner Join groups AS g ON g.id = gs.group_id
WHERE gp.id="1" and s.name = "john"
Ответ №3:
Еще один вариант, позволяющий избежать DISTINCT
и (возможно, ненужное) присоединиться к groups
:
SELECT s.*
FROM students AS s
WHERE EXISTS
( SELECT *
FROM group_student AS gs
WHERE gs.student_id = s.id
AND ( gs.group_id = 8
OR (gs.group_id, s.name) = (1, 'john')
)
)