Нет нулевых значений в 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_ids, затем создайте список всех из них, используя 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;
Другие вопросы по тегам