Помощь в соединении SQL в сочетании с большим количеством подзапросов - PullRequest
1 голос
/ 25 марта 2011

У меня ограниченный опыт работы с объединениями, и эта головоломка поставила меня в тупик.

Вот соответствующие таблицы из моей базы данных mysql:

  • Таблица студентов
  • Таблица разделов, описывающая разделы данного курса
  • Таблица карт, которая создает отношение «многие ко многим» между разделами и студентами
  • Таблица экзаменов, описывающая экзамены
  • Aтаблица сопоставлений «многие ко многим» между экзаменами и разделами
  • Таблица экзаменов_скриптов, в которой описываются дни, в которые можно сдавать экзамены.Между экзаменами и графиком экзаменов существует отношение один ко многим.

Моя цель: получить всех студентов, которые зачислены в разделы, в которых запланированы экзамены на определенную дату.Также получите информацию о расписании экзаменов для каждого теста, который студент должен сдать в указанный день.Желательно иметь строку в наборе результатов для каждой пары студентов <-> exam_schedule.

У меня есть запрос, который выполняет первую половину моей цели (у него много подзапросов):

SELECT * FROM `students` WHERE `id` IN
    (SELECT `student_id` FROM `sections_students` WHERE `section_id` IN
        (SELECT `section_id` FROM `sections_exams` WHERE `exam_id` IN
            (SELECT `exam_id` FROM `exam_schedules` WHERE `date` = DATE('$date') AND `exam_id` IN
                (SELECT `id` FROM `exams` WHERE `isAutoSignup` = 1))))

Чего я не могу понять, так это как включить соединение в него для достижения второй половины моей цели.Каждая моя попытка вызвала синтаксическую ошибку.Пожалуйста, кто-нибудь может указать мне правильное направление?Заранее спасибо!

Ответы [ 2 ]

3 голосов
/ 25 марта 2011

Вы можете сделать все это с помощью объединений и, таким образом, получить exam_schedules следующим образом:

SELECT s.*, es.*
  FROM students s
JOIN sections_students ss on s.id          = ss.student_id
JOIN sections_exams    se on se.section_id = ss.section_id
JOIN exam_schedules    es on es.exam_id    = se.exam_id and date = DATE('$date')
JOIN exams             e  on e.id          = es.exam_id and isAutoSignup = 1
0 голосов
/ 25 марта 2011

Вот выстрел:

SELECT S.Student_name, E.Exam_name, ES.date
FROM students S
LEFT OUTER JOIN SECTIONS_STUDENTS SS
  ON SS.student_id = S.stuent_id
LEFT OUTER JOIN SECTIONS_EXAMS SE
  ON SE.section_id = SS.section_id
LEFT OUTER JOIN  EXAMS E
  ON E.exam_id = SE.exam_id
LEFT OUTER JOIN EXAM_SCHEDULES ES
  ON ES.exam_id =E.exam_id
WHERE 1=1
  AND E.isAutoSignup = 1
  AND ES.Date = DATE('$date')

Объединения - это как выписывание твоих мыслей.

я хочу, чтобы студенты и я хочу, чтобы студенты в разделах и я хочу экзамены по разделам и я хочу расписание экзаменов фильтровать расписание экзаменов и экзамены таким образом ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...