Нет нулевых значений в COUNT с 2 ORDER BY утверждениями
У меня есть 3 таблицы:
+---------+ +----------+ +----------+
| kkw | | block | | status |
+---------+ +----------+ +----------+
| kkw_id | | block_id | |status_id |
| land_id | | kkw_id | | .... |
| ... | | status_id| | .... |
+---------+ +----------+ +----------+
И я хочу отобразить количество блоков на страну (land_id) и статус, с нулем, если в стране нет блока, соответствующего статусу. Я пытаюсь этот запрос, но нулевые значения не отображаются:
SELECT s.status_id, k.land_id, COUNT(b.block_id)
FROM kkw_status AS s
LEFT JOIN block AS b ON s.status_id = b.status_id
LEFT JOIN kkw AS k ON b.kkw_id=k.kkw_id
GROUP BY s.status_id, k.land_id
ORDER BY k.land_id, s.status_id;
Результат:
status_id land_id count
1 1 2
4 1 3 ....
Но я бы хотел:
status_id land_id count
1 1 2
2 1 0
3 1 0
4 1 3 .....
Любая идея? Спасибо
1 ответ
Решение
Вы группируете по k.land_id
, Следовательно, когда что-то не совпадает, оно получает значение NULL
для этого столбца. Таким образом, нулевые значения будут отображаться только в таких строках.
Если вы хотите все status_id
с и land_id
s, затем создайте список всех из них, используя cross join
и затем вычислите число, соответствующее каждой группе. Я думаю, что так выглядит запрос:
SELECT s.status_id, k.land_id, COUNT(b.block_id)
FROM kkw_status s CROSS JOIN
kkw k LEFT JOIN
block b
ON b.status_id = s.status_id AND b.kkw_id = k.kkw_id
GROUP BY s.status_id, k.land_id
ORDER BY k.land_id, s.status_id;