Как сделать запрос из 4 таблиц - PullRequest
1 голос
/ 28 сентября 2019

У меня проблема с созданием View с использованием SQL.Мне нужно сделать представление из 4 таблиц:

tbl_school, tbl_teacher, tb_student и tbl_class.

Это моя структура таблицы: Table Structure

А это мой оператор просмотра

SELECT
tbl_school.school_id,
tbl_school.school_nm,
(SELECT COUNT(*) FROM tbl_class) AS class,
(SELECT COUNT(*) FROM tbl_teacher) AS teacher,
(SELECT COUNT(*) FROM tbl_student) AS student
FROM
tbl_school
INNER JOIN tbl_teacher ON tbl_school.school_id = tbl_teacher.school_id
INNER JOIN tbl_class ON tbl_teacher.teacher_id = tbl_class.teacher_id AND tbl_school.school_id = tbl_class.school_id
INNER JOIN tbl_student ON tbl_class.class_id = tbl_student.class_id
GROUP BY
tbl_school.school_id

И вот результат запроса:

Query Result

Проблема в том, что у меня есть один учитель в школе SD1 и другой учитель в школе SD2.У каждого учителя есть один класс, а в школе SD1 - два ученика, а в школе SD2 - один ученик.

Можно ли получить желаемые результаты?

Ответы [ 2 ]

1 голос
/ 28 сентября 2019

Вы можете использовать агрегацию, содержащую DISTINCT ключевые слова, и лучше использовать псевдонимы и еще один столбец (tbl_school.school_nm) в списке GROUP BY, чтобы сделать его более подходящим SQL ( Кстати, некоторые СУБД don 't позволяет исключить этот столбец из GROUP BY, в то время как MySQL разрешает ):

SELECT s.school_id, s.school_nm,
       COUNT(DISTINCT c.class_id) AS class,
       COUNT(DISTINCT t.teacher_id) AS teacher,
       COUNT(DISTINCT d.student_id) AS student -- this is a presumedly existing column within the student table
  FROM tbl_school s
  JOIN tbl_teacher t ON s.school_id = t.school_id
  JOIN tbl_class c ON t.teacher_id = c.teacher_id AND s.school_id = c.school_id
  JOIN tbl_student d ON c.class_id = d.class_id
 GROUP BY s.school_id, s.school_nm
0 голосов
/ 28 сентября 2019

Добро пожаловать в SO.

Прошло много времени с тех пор, как я это сделал, но пытались ли вы добавить модификатор WHERE к своим внутренним операторам выбора SQL?Вот так ...

Примечание: для меня более логично также иметь FK на tbl_student, который связывает их с той школой, в которой они находятся.

SELECT
tbl_school.school_id,
tbl_school.school_nm,
(SELECT COUNT(*) FROM tbl_class WHERE school_id=tbl_school.school_id) AS class,
(SELECT COUNT(*) FROM tbl_teacher WHERE school_id=tbl_school.school_id) AS teacher,
(SELECT COUNT(*) FROM tbl_student) AS student
FROM
tbl_school
INNER JOIN tbl_teacher ON tbl_school.school_id = tbl_teacher.school_id
INNER JOIN tbl_class ON tbl_teacher.teacher_id = tbl_class.teacher_id AND tbl_school.school_id = tbl_class.school_id
INNER JOIN tbl_student ON tbl_class.class_id = tbl_student.class_id
GROUP BY
tbl_school.school_id
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...