Получение всех записей из внутренних соединений нескольких таблиц - PullRequest
0 голосов
/ 04 июня 2018

У меня есть три таблицы tblCourse, tblDegree, tblStudent.Я создал таблицу отношений курса и степени, как tblCourseDegreeRelation.Эта реляционная таблица использует внешние ключи курса и таблицы степеней, например:

Мне нужно получить все записи, включая tblStudent все записи, используя этот запрос:

SELECT * from tbldegree d
INNER JOIN tblcoursedegreerelation cdr ON d.d_id = cdr.d_id
INNER JOIN tblcourse c ON cdr.c_id = c.c_id
INNER JOIN tblstudent s ON d.d_id = s.d_id
ORDER BY cdr.cdr_id DESC

Ноэто возвращает только запись одного студента, в то время как у меня в базе данных есть два студента, см. SQLFiddle :

Как я могу получить записи всех студентов из запроса объединений?

Любая помощь будет по достоинству оценена!

Ответы [ 2 ]

0 голосов
/ 05 июня 2018

В вашем случае у вас есть все внутренние объединения, поэтому он будет возвращать результаты, когда обе / все таблицы удовлетворяют их критериям (в пункте).

Просмотр ваших данных ваш ученик 1 => Али имеет отношение со степенью1 => БС Информационные технологии.Кроме того, в степени 1 есть курсы (1 => Программирование, 2 => Английский, 5 => Математика, 6 => Электроника)

Так что для студента 1 ваше предложение внутреннего объединения работает, поскольку оно содержит данные во всех объединенных таблицах.

Теперь, если мы ищем вашего студента 3 => Билал, который имеет отношение со степенью 3 => BS по математике, но у этой степени нет назначенных курсов, поэтому ваш студент Билал не возвращается

Чтобы получить все студенты независимо от того, есть ли у них соответствующие курсы, вы можете превратить свои внутренние объединения в левое объединение не для всех таблиц, а для tblcoursedegreerelation и tblcourse

SELECT * 
FROM tblstudent s 
INNER JOIN tbldegree d ON d.d_id = s.d_id
LEFT JOIN tblcoursedegreerelation cdr ON d.d_id = cdr.d_id
LEFT JOIN tblcourse c ON cdr.c_id = c.c_id
ORDER BY cdr.cdr_id DESC

Демо

В наборе результатов вы можете видеть следующие столбцы как нулевые из-за отсутствия связи с курсами

cdr_id, c_id, d_id, c_id, c_name, c_credit

0 голосов
/ 04 июня 2018

Просто выполните правое соединение на tblstudent:

SELECT * from tbldegree d
INNER JOIN tblcoursedegreerelation cdr ON d.d_id = cdr.d_id
INNER JOIN tblcourse c ON cdr.c_id = c.c_id
RIGHT JOIN tblstudent s ON d.d_id = s.d_id
ORDER BY cdr.cdr_id DESC

РЕДАКТИРОВАТЬ Этот способ лучше:

SELECT c.d_id,c.d_name,c.d_fee,cdr.cdr_id,cdr_c_id,deg.c_name,deg.d_credit,a.s_id,a.s_name
FROM tblstudent a
     left join tblDegree c ON a.d_id = c.d_id
     left join tblcoursedegreerelation cdr ON cdr.d_id=c.d_id
     left join tblcourse deg on deg.c_id=cdr.c_id

ORDER BY cdr.cdr_id DESC
...