Я искал ответ на этот вопрос, но не нашел его для этой конкретной проблемы. Я создаю базу данных для хранения классов, созданных учителем, и таблицу поиска для учащихся, обучающихся в каждом классе. Я хочу запустить запрос, который показывает каждый класс преподавателя и количество студентов. Как вы можете видеть в приведенных ниже данных, учитель имеет два класса с нулевыми учениками, но только один из них возвращается в запрос.
Запрос:
SELECT 'c'.'ClassID' AS 'id',
'c'.'Class_Name' AS 'name',
'c'.'Class_Code' AS 'code',
COUNT('e'.'EnrollID') AS 'count'
FROM 'CMP_Classes' 'c'
LEFT OUTER JOIN 'CMP_Student_Enrollment' 'e'
ON 'c'.'ClassID' = 'e'.'Enroll_ClassID'
AND 'Class_Teacher' = 1
GROUP BY 'e'.'EnrollID'
Данные:
Таблица CMP_Classes:
ClassID | Class_Name | Class_Code | Class_Teacher
1 | Mr. Jones' 1st Period Class | QYTNPCGK | 1
2 | Mr. Jones' 2nd Period Class | HZWNDZPM | 1
3 | Pizza | RRCXQNNE | 9
4 | Mr. Jones' 3rd Period Class | NFLBXFEQ | 1
Таблица CMP_Student_Enrollment:
EnrollID | Enroll_Student | Enroll_ClassID
3 | 2 | 1
Результаты запроса:
id | name | code | count
2 | Mr. Jones' 2nd Period Class | HZWNDZPM | 0
1 | Mr. Jones' 1st Period Class | QYTNPCGK | 1
Итак, как вы можете видеть, нет строки для "третьего класса г-на Джонса", но должно быть.
Вы должны group by
в неагрегированных столбцов в select
:
SELECT c.ClassID AS id, c.Class_Name AS name, c.Class_Code AS code,
COUNT(e.EnrollID) AS 'count'
FROM CMP_Classes c LEFT OUTER JOIN
CMP_Student_Enrollment e
ON c.ClassID = e.Enroll_ClassID
WHERE c.Class_Teacher = 1
GROUP BY c.ClassID, c.Class_Name, c.Class_Code;
Все обратные шаги в вашем запросе затрудняют чтение и запись.