За последние 24 часа нас посетили 16810 программистов и 1646 роботов. Сейчас ищут 879 программистов ...

Помощь с запросом

Тема в разделе "MySQL", создана пользователем marlin, 14 сен 2021.

  1. marlin

    marlin Активный пользователь

    С нами с:
    19 июн 2019
    Сообщения:
    66
    Симпатии:
    3
    Приветствую.
    Есть таблица "студент"
    Id name

    Таблица "предмет"
    Id name

    И таблица связи один ко многим - предметы студента
    Id_student id_lesson

    Как бы мне отфильтровать студентов, чтобы показались только те, у кого есть один из предметов?

    Т.е. на входе будет массив id предметов, а должен получить список студентов у кого есть хоть один из таких предметов.

    Если просто left join делать с таблицы студентов с таблицей связи то много же строк дублей пойдёт, distinct что ли нужен.
     
  2. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.866
    Симпатии:
    753
    Адрес:
    Татарстан
    Или group by
     
    don.bidon нравится это.
  3. don.bidon

    don.bidon Активный пользователь

    С нами с:
    28 мар 2021
    Сообщения:
    940
    Симпатии:
    145
    или голову включать, рано или поздно что-то сработает
     
  4. Slava Rozhnev

    Slava Rozhnev Новичок

    С нами с:
    6 сен 2021
    Сообщения:
    87
    Симпатии:
    26
    Адрес:
    https://phpize.online
    Попробуйте так:

    Код (Text):
    1. select * from students
    2. where exists (
    3.     select 1 from students_lessonss
    4.       join lessonss on lessonss.Id = students_lessonss.Id_lesson
    5.       where
    6.           students_lessonss.Id_stident = students.Id and
    7.           lessonss.Name in ('Mathematics', 'Phisics')
    8. );
    SQL fiddle
     
  5. marlin

    marlin Активный пользователь

    С нами с:
    19 июн 2019
    Сообщения:
    66
    Симпатии:
    3
    Я смотрю что если в select указать только столбцы от student то и так работает:

    Код (Text):
    1. 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, поэтому не тот результат давало.
    Но я бы так не хотел на будущее делать, новые приджойненные столбцы могут понадобиться, но для этого также есть решение без подзапросов
     
    Slava Rozhnev нравится это.
  6. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.131
    Симпатии:
    1.250
    Адрес:
    там-сям
    Код (SQL):
    1. SELECT DISTINCT s.*
    2. FROM students AS s
    3. JOIN lessons_students AS ls ON ls.student_id = s.id
    4. JOIN lessons AS l ON l.id = ls.lesson_id
    5. WHERE l.name IN('Mathematics', 'Phisics')
    но на самом деле не надо избегать подзапросов ))) если ты думаешь, что подзапрос это по определению лишняя сложность/тормоза, то ты ошибаешся. вот distinct это обычно костыль и неоптимальный план выполнения
    Код (SQL):
    1. SELECT s.*
    2. FROM students AS s
    3. WHERE s.id IN (
    4.   SELECT ls.student_id
    5.   FROM lessons_students AS ls
    6.   JOIN lessons AS l ON l.id = ls.student_id
    7.   WHERE l.name IN('Mathematics', 'Phisics')
    8. )