СОЕДИНЕНИЯ в запросе в итоге отображают слишком много строк - PullRequest
1 голос
/ 30 октября 2011

Ниже мой запрос:

 $query = "
          SELECT DISTINCT gr.SessionId, t.TeacherUsername, t.TeacherForename,
                          t.TeacherSurname, cm.ModuleId, m.ModuleName, 
                          cm.CourseId, c.CourseName, st.Year, st.StudentUsername, 
                          st.StudentForename, st.StudentSurname, gr.Mark, gr.Grade
          FROM Teacher t
          INNER JOIN Session s ON t.TeacherId = s.TeacherId
          JOIN Grade_Report gr ON s.SessionId = gr.SessionId
          JOIN Student st ON gr.StudentId = st.StudentId
          JOIN Course c ON st.CourseId = c.CourseId
          JOIN Course_Module cm ON c.CourseId = cm.CourseId
          JOIN Module m ON cm.ModuleId = m.ModuleId
          WHERE
            ('".mysql_real_escape_string($sessionid)."' = '' OR gr.SessionId = '".mysql_real_escape_string($sessionid)."')
          ORDER BY $orderfield ASC
          ";

Вам не нужно беспокоиться о предложении WHERE и предложении ORDER BY.Моя проблема в том, что результат запроса показывает 26 строк, когда он должен показывать 13 строк.

Я знаю причину этого, и это потому, что таблица Course_Module является таблицей перекрестных ссылок между таблицей курса и таблицей модулей и необходима для того, чтобы можно было связать между собой таблицу курса и таблицу модулей.

Но таблица курса использует CourseId для соединения с другой таблицей, как и таблица Course_Module.Таким образом, CourseId используется дважды в разделе JOINS, и поэтому он снова дублирует строки.Таким образом, должно быть 13 строк, но, поскольку каждая строка дублируется, она показывает 26.

Я попробовал GROUP BY cm.CourseId, но в итоге он отображает 2 строки, которые представляют собой два разных CourseId, что совсем не то, что мне нужно.

Так что мой вопрос в том, что я могу использовать таблицу Course_Module для JOIN-таблиц, но игнорировать ее, когда дело доходит до отображения результатов?

Если запрос был таким:

 $query = "
          SELECT DISTINCT gr.SessionId, t.TeacherUsername, t.TeacherForename,
                          t.TeacherSurname, cm.ModuleId, m.ModuleName, 
                          cm.CourseId, c.CourseName, st.Year, st.StudentUsername, 
                          st.StudentForename, st.StudentSurname, gr.Mark, gr.Grade
          FROM Teacher t
          INNER JOIN Session s ON t.TeacherId = s.TeacherId
          JOIN Grade_Report gr ON s.SessionId = gr.SessionId
          JOIN Student st ON gr.StudentId = st.StudentId
          JOIN Course c ON st.CourseId = c.CourseId;

В этом запросе показано 13 строк, но это означает, что нет ссылки на таблицу модулей, поэтому неизвестно название модулей, взятых для каждой оценки класса.

Ниже приведен пример результата, который я получаю в данный момент.:

Student    Session         Module          Course         Grade
S1         AAA             CHT2520         ICT            A
S1         AAA             CHT2520         ICT            A
S2         AAA             CHT2520         ICT            B
S2         AAA             CHT2520         ICT            B
S3         AAB             CHT2220         BIT            D
S3         AAB             CHT2220         BIT            D
S4         AAC             CHI2250         COMP           A
S4         AAC             CHI2250         COMP           A

Это должно быть:

Ниже приведен результат, который я получаю в данный момент:

Student    Session         Module          Course         Grade
S1         AAA             CHT2520         ICT            A
S2         AAA             CHT2520         ICT            B
S3         AAB             CHT2220         BIT            D
S4         AAC             CHI2250         COMP           A

Спасибо

Ответы [ 2 ]

1 голос
/ 30 октября 2011

Ваше предложение select запрашивает 14 столбцов. Результаты, которые вы показали, имели только 5. Если вы ограничите предложение select этими 5 столбцами, вы получите 13 нужных вам строк.

Чтобы включить все 14 столбцов, посмотрите на другие столбцы в результатах. Поймите, что прямо сейчас у вас не 26 строк в наборе результатов, а 13 пар строк. Посмотрите внимательно на каждую пару, и где-нибудь вы найдете другой столбец & mdash; то, что отличает одну запись в сопоставленной паре от другой. Добавьте условие к соединению в таблице, в которой размещен этот столбец, чтобы одно из значений не попало в ваши результаты, и вы получите правильное количество строк. Для этого может потребоваться производная таблица или коррелированный подзапрос в условии соединения, чтобы ограничить объединение только первым соответствием (для некоторого определения «first», определенного подзапросом) .

0 голосов
/ 30 октября 2011

Я не большой эксперт, но почему вы используете два разных объединения в вашем случае? Придерживайтесь INNER JOIN на протяжении всего запроса, и это может решить проблему.

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