Многие ко многим запрос с фильтром - PullRequest
0 голосов
/ 01 октября 2011

У меня следующая проблема.Есть две таблицы - 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")

Работает.Но, как запросить, если я хочу выбрать только сегмент студентов группы ID 1. Например, s.name = "john".Таким образом, результат должен быть: all students from group id 8 + all students with name "john" from group id 1.

Спасибо за сообщения: -)

Ответы [ 3 ]

2 голосов
/ 01 октября 2011

Попробуйте это:

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 голос
/ 01 октября 2011

Вы также можете использовать 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 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"
0 голосов
/ 01 октября 2011

Еще одна опция, исключающая 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')
                )
        )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...