возвращает счетчик 0 с группой mysql по таблице

таблица базы данных похожа на этот

============================
= 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 потому что в таблице пригородов suburb_id 4 нет, я хочу, чтобы этот запрос возвращал 0 для suburb_id = 4, например

============================
= total       |   suburb_id
= 2           |    1
= 1           |    2
= 1           |    3
= 0           |    4
9
задан OMG Ponies 30 August 2010 в 02:58
поделиться

3 ответа

Это:

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 записей.

4
ответ дан 4 December 2019 в 12:16
поделиться

GROUP BY требует строк для работы, поэтому, если у вас нет строк для определенной категории, вы не получите подсчет. Думайте о предложении where как об ограничении исходных строк, прежде чем они будут сгруппированы вместе. Предложение 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, извинения)

11
ответ дан 4 December 2019 в 12:16
поделиться

Запрос:

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
1
ответ дан 4 December 2019 в 12:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: