Функция count не возвращает 0 count для нулевых значений в группе по запросу MySQL - PullRequest
0 голосов
/ 09 октября 2018

Мой запрос похож на этот

SELECT 
    rc.id as id,
    rc.name AS categoryName,
    count(r.category) AS raveCount
FROM
    rave r
        LEFT JOIN
    rave_category rc ON (r.category = rc.id)
WHERE
    r.sent_by = 1
GROUP BY rc.id;

Здесь я прикрепил обе структуры таблицы

rave table

rave category table

но ответ не возвращает 0-е значения для других названий категорий

enter image description here

Ответы [ 3 ]

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

используйте ifnull функцию, в случае нулевого значения она вернет 0

SELECT 
    rc.id as id,
    rc.name AS categoryName,
    IFNULL(count(r.category),0) AS raveCount
FROM
    rave r
        LEFT JOIN
    rave_category rc ON (r.category = rc.id)
WHERE
    r.sent_by = 1
GROUP BY rc.id,rc.name;
0 голосов
/ 09 октября 2018

Если я правильно понял вашу цель, вам просто нужно переключить левый и правый столы на противоположные.

SELECT 
    rc.id as id,
    rc.name AS categoryName,
    count(r.category) AS raveCount
FROM rave_category rc
LEFT JOIN rave r
ON r.category = rc.id
  AND r.sent_by = 1
GROUP BY rc.id;
0 голосов
/ 09 октября 2018

r.category находится в левой таблице.В нем не будет значений null (из-за несоответствия записей) после Left Join.Вам нужно сосчитать rc.id, чтобы он считал ноль, если в самой правой таблице нет соответствующих записей.

Кроме того, вы должны упомянуть все столбцы select (кроме агрегированных выражений) вГруппировка по.

Также вам нужно выбрать r.category в самой левой таблице.И я изменил псевдоним на cat_id, чтобы сделать его однозначным.

Попробуйте:

SELECT 
    r.category AS cat_id,
    rc.name AS categoryName,
    count(rc.id) AS raveCount
FROM
    rave r
        LEFT JOIN
    rave_category rc ON (r.category = rc.id)
WHERE
    r.sent_by = 1
GROUP BY cat_id, 
         categoryName  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...