Не возвращать запись во время операции COUNT (), если нет результатов - PullRequest
0 голосов
/ 09 сентября 2018

Я пытаюсь узнать, сколько учеников зачислено в класс. Выше работает, если есть записи.

Однако, если результатов нет, возвращается одна «запись», где все поля NULL, кроме students_count, который возвращает ноль

+---+------+------+----------------+----------------+
|   | id   | name | professor_name | students_count |
+---+------+------+----------------+----------------+
| 1 | null | null | null           | 0              |
+---+------+------+----------------+----------------+

Хотелось бы, чтобы записи НЕ возвращались.

Если запись возвращается, она выглядит следующим образом.

+---+----+-------------+----------------+----------------+
|   | id | name        | professor_name | students_count |
+---+----+-------------+----------------+----------------+
| 1 | 1  | Science 101 | Atkins         | 16             |
+---+----+-------------+----------------+----------------+

Я пробовал варианты LEFT JOIN и комбинацию IFNULL(COUNT(DISTINCT students.id), null) AS students_count

Но я не могу заставить его работать.

Любая помощь?

SELECT  classes.*,
        professors.name AS professor_name,
        COUNT(DISTINCT students.id) AS students_count
FROM classes
INNER JOIN professors ON classes.professor_id = professors.id
LEFT JOIN students ON  classes.id = students.class_id AND classes.class_id IS NOT NULL
WHERE classes.class_id = 3

Используя приведенные ниже общие данные с class_id, равным 3, результат НЕ ДОЛЖЕН быть записями. Но возвращается запись null с числом 0.

+---+------+------+----------------+----------------+
|   | id   | name | professor_name | students_count |
+---+------+------+----------------+----------------+
| 1 | null | null | null           | 0              |
+---+------+------+----------------+----------------+

Использование class_id 1 вернет:

+---+----+-------------+----------------+----------------+
|   | id | name        | professor_name | students_count |
+---+----+-------------+----------------+----------------+
| 1 | 1  | Science 101 | Atkins         | 4              |
+---+----+-------------+----------------+----------------+

Общие данные

Классы

+---+-------------+---------------+
|   | name        | professors_id |
+---+-------------+---------------+
| 1 | Science 101 | 1             |
+---+-------------+---------------+
| 2 | Math        | 2             |
+---+-------------+---------------+
| 3 | English     | 3             |
+---+-------------+---------------+

Профессора

+----+--------+
| id | name   |
+----+--------+
| 1  | Atkins |
+----+--------+
| 2  | Button |
+----+--------+
| 3  | Castor |
+----+--------+

Студенты

+----+-------+------------+
| id | name  | classes_id |
+----+-------+------------+
| 1  | Adam  | 1          |
+----+-------+------------+
| 2  | Beth  | 1          |
+----+-------+------------+
| 3  | Chris | 1          |
+----+-------+------------+
| 4  | David | 1          |
+----+-------+------------+
| 5  | Erma  | 2          |
+----+-------+------------+

1 Ответ

0 голосов
/ 09 сентября 2018

Вы можете попробовать использовать INNER JOIN вместо OUTER JOIN, поскольку LEFT JOIN будет основываться на таблице classes.

SELECT  classes.*,
        professors.name AS professor_name,
        COUNT(DISTINCT students.id) AS students_count
FROM classes
INNER JOIN professors ON classes.professor_id = professors.id
INNER JOIN students ON  classes.id = students.class_id
WHERE classes.class_id = 3

sqlfiddle

EDIT

HAVING предложение для условия агрегатной функции. но вы используете HAVING classes.class_id IS NOT NULL, который может перейти к where

SELECT  classes.*,
        professors.name AS professor_name,
        COUNT(DISTINCT students.id) AS students_count
FROM classes
INNER JOIN professors ON classes.professor_id = professors.id
LEFT JOIN students ON  classes.id = students.class_id 
WHERE classes.class_id = 3 AND classes.class_id IS NOT NULL
...