Запрос «Многие ко многим» с фильтром

#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')
                )
        )