Приветствую. Есть таблица "студент" Id name Таблица "предмет" Id name И таблица связи один ко многим - предметы студента Id_student id_lesson Как бы мне отфильтровать студентов, чтобы показались только те, у кого есть один из предметов? Т.е. на входе будет массив id предметов, а должен получить список студентов у кого есть хоть один из таких предметов. Если просто left join делать с таблицы студентов с таблицей связи то много же строк дублей пойдёт, distinct что ли нужен.
Попробуйте так: Код (Text): select * from students where exists ( select 1 from students_lessonss join lessonss on lessonss.Id = students_lessonss.Id_lesson where students_lessonss.Id_stident = students.Id and lessonss.Name in ('Mathematics', 'Phisics') ); SQL fiddle
Я смотрю что если в select указать только столбцы от student то и так работает: Код (Text): select distinct s.* from students s left join students_lessonss sl on s.id=sl.Id_stident where sl.Id_stident in (1,2); По умолчанию orm звездочку подставляет в select, поэтому не тот результат давало. Но я бы так не хотел на будущее делать, новые приджойненные столбцы могут понадобиться, но для этого также есть решение без подзапросов
Код (SQL): SELECT DISTINCT s.* FROM students AS s JOIN lessons_students AS ls ON ls.student_id = s.id JOIN lessons AS l ON l.id = ls.lesson_id WHERE l.name IN('Mathematics', 'Phisics') но на самом деле не надо избегать подзапросов ))) если ты думаешь, что подзапрос это по определению лишняя сложность/тормоза, то ты ошибаешся. вот distinct это обычно костыль и неоптимальный план выполнения Код (SQL): SELECT s.* FROM students AS s WHERE s.id IN ( SELECT ls.student_id FROM lessons_students AS ls JOIN lessons AS l ON l.id = ls.student_id WHERE l.name IN('Mathematics', 'Phisics') )