return count 0 с mysql group by

таблица базы данных

============================ = suburb_id | value = 1 | 2 = 1 | 3 = 2 | 4 = 3 | 5 

запрос

 SELECT COUNT(suburb_id) AS total, suburb_id FROM suburbs where suburb_id IN (1,2,3,4) GROUP BY suburb_id 

однако, пока я запускаю этот запрос, он не дает COUNT (suburb_id) = 0, когда suburb_id = 0, потому что в таблице suburbs нет suburb_id 4, я хочу, чтобы этот запрос возвращал 0 для suburb_id = 4, например

 ============================ = total | suburb_id = 2 | 1 = 1 | 2 = 1 | 3 = 0 | 4 

Группа GROUP BY нуждается в строках для работы, поэтому, если у вас нет строк для определенной категории, вы не получите счет. Подумайте о том, где предложение ограничивает исходные строки до их группировки. Предложение where не предоставляет список категорий для группировки.

Вы можете написать запрос для выбора категорий (пригородов), а затем выполнить подсчет в подзапросе. (Я не уверен, что поддержка MySQL для этого похожа)

Что-то вроде:

 SELECT s.suburb_id, (select count(*) from suburb_data d where d.suburb_id = s.suburb_id) as total FROM suburb_table s WHERE s.suburb_id in (1,2,3,4) 

(MSSQL, извинения)

Эта:

 SELECT id, COUNT(suburb_id) FROM ( SELECT 1 AS id UNION ALL SELECT 2 AS id UNION ALL SELECT 3 AS id UNION ALL SELECT 4 AS id ) ids LEFT JOIN suburbs s ON s.suburb_id = ids.id GROUP BY id 

или это:

 SELECT id, ( SELECT COUNT(*) FROM suburb WHERE suburb_id = id ) FROM ( SELECT 1 AS id UNION ALL SELECT 2 AS id UNION ALL SELECT 3 AS id UNION ALL SELECT 4 AS id ) ids 

В этой статье сравниваются характеристики двух подходов:

  • Агрегаты: подзапросы против группы

, хотя это не имеет большого значения в вашем случае, поскольку вы запрашиваете только 4 записи.

Запрос:

 select case when total is null then 0 else total end as total_with_zeroes, suburb_id from (SELECT COUNT(suburb_id) AS total, suburb_id FROM suburbs where suburb_id IN (1,2,3,4) GROUP BY suburb_id) as dt 

Решение @ geofftnz отлично работает, если все условия просты, как в этом случае. Но мне просто пришлось решить подобную проблему, чтобы создать отчет, в котором каждый столбец в отчете представляет собой другой запрос. Когда вам нужно комбинировать результаты нескольких операторов select, тогда что-то вроде этого может работать.

Возможно, вам придется программно создать этот запрос. Использование левого соединения позволяет запросу возвращать строки, даже если нет совпадений с suburb_id с данным идентификатором. Если ваш db поддерживает его (что больше всего делает), вы можете использовать IFNULL для замены null значением 0:

 select IFNULL(a.count,0), IFNULL(b.count,0), IFNULL(c.count,0), IFNULL(d.count,0) from (select count(suburb_id) as count from suburbs where id=1 group by suburb_id) a, left join (select count(suburb_id) as count from suburbs where id=2 group by suburb_id) b on a.suburb_id=b.suburb_id left join (select count(suburb_id) as count from suburbs where id=3 group by suburb_id) c on a.suburb_id=c.suburb_id left join (select count(suburb_id) as count from suburbs where id=4 group by suburb_id) d on a.suburb_id=d.suburb_id; 

Самое приятное в этом состоит в том, что (при необходимости) каждое «левое соединение» может использовать несколько иной (возможно, довольно сложный) запрос.

Отказ от ответственности: для больших наборов данных этот тип запросов может не работать очень хорошо (я не пишу достаточно sql, чтобы знать, не исследуя далее), но по крайней мере он должен давать полезные результаты 😉