Показывать нулевые значения в группе по запросу как ноль - PullRequest
0 голосов
/ 05 марта 2019

У меня есть две таблицы, задачи и статус. Таблица задач имеет столбцы task_id, project_id task_content и status_id. Таблица состояния имеет столбцы status_id и status_name. Я хочу получить запрос, который принимает все имена состояний и подсчитывает, сколько существует задач с именами этих состояний. Мой запрос выглядит так:

РЕДАКТИРОВАТЬ: я забыл добавить project_id. Запрос должен проверять только задачи в рамках одного проекта.

SELECT s.status_name, COUNT(t.status_id) AS tasks
FROM status s
LEFT JOIN tasks t
ON s.status_id = t.status_id
WHERE t.project_id = 1
GROUP BY s.status_name

Мой запрос работает хорошо, но когда нет задач с одним из статусов, этот статус исключается из запроса, я хочу, чтобы он показывал ноль, например:

    status name | tasks 
     status 1   |  3 
     status 2   |  2
     status 3   |  0

но мой запрос выглядит так:

status name | tasks 
 status 1   |  3 
 status 2   |  2

Ответы [ 5 ]

0 голосов
/ 05 марта 2019

Просто переместите условие where в условие on:

SELECT s.status_name, COUNT(t.status_id) AS tasks
FROM status s LEFT JOIN
     tasks t
     ON s.status_id = t.status_id AND
        t.project_id = 1
GROUP BY s.status_name;

COUNT() никогда не возвращает значение NULL, поэтому вам не нужна дополнительная проверка.Возвращает 0, если совпадений нет.

0 голосов
/ 05 марта 2019

Спасибо всем за помощь, я нашел решение. Я опубликую это для всех, у кого будут подобные или подобные проблемы в будущем. Использование 'ГДЕ' испортит мое левое соединение, так что есть обходной путь:

SELECT s.status_name, (IFNULL(COUNT(t.task_id), 0)) AS tasks
FROM status s 
LEFT OUTER JOIN tasks t
ON  s.status_id = t.status_id 
AND t.project_id = 1 
GROUP BY s.status_name 
0 голосов
/ 05 марта 2019

Попробуйте ниже - используйте count(t.status_id) вместо count(*)

SELECT s.status_id,s.status_name, COUNT(t.status_id) AS tasks
    FROM status s
    LEFT JOIN tasks t
    ON s.status_id = t.status_id
    GROUP BY s.status_id,s.status_name
0 голосов
/ 05 марта 2019

попробуйте как ниже

SELECT s.status_name, COUNT(t.status_id) AS tasks
FROM status s
LEFT JOIN tasks t
ON s.status_id = t.status_id
GROUP BY s.status_name

Обратите внимание, что вам нужно status 3 это значение в вашей левой таблице также, тогда оно придет к имени, иначе не будет

0 голосов
/ 05 марта 2019

ЭТО ОТВЕТЫ НА ВОПРОС, ОСНОВАННЫЙ НА ОРИГИНАЛЬНОМ ПОЧТЕ (ПЕРЕД КАКИМ-ЛИБО РЕДАКТИРОВАНИЕМ):

Использовать имя_ столбца (т. Е. t.status_id) внутри count():

SELECT s.status_name, COUNT(t.status_id) AS tasks
FROM status s LEFT JOIN 
     tasks t
     ON s.status_id = t.status_id
GROUP BY s.status_name;
...