#mysql #group-by
#mysql #сгруппировать по
Вопрос:
В моей базе данных есть две структуры таблиц:
CREATE TABLE `projects` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(32) DEFAULT NULL,
`description` varchar(128) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=8 DEFAULT CHARSET=utf8
CREATE TABLE `issues` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`member_id` varchar(10) DEFAULT NULL,
`project_id` int(11) DEFAULT NULL,
`name` varchar(32) DEFAULT NULL,
`description` varchar(128) DEFAULT NULL,
`date_created` date DEFAULT NULL,
`type` enum('general','bug','requirement') DEFAULT NULL,
`priority` enum('low','medium','high') DEFAULT NULL,
`status` enum('resolved','open','discarded') DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `member_id` (`member_id`),
KEY `project_id` (`project_id`)
) ENGINE=MyISAM AUTO_INCREMENT=9 DEFAULT CHARSET=utf8
Что я пытаюсь сделать, так это создать оператор select, который возвращает название проекта и количество разрешенных проблем, связанных с этим проектом. Я создал следующую инструкцию SQL:
select projects.name, count(*) from projects left join issues on projects.id = issues.project_id where status = 'resolved' group by projects.name
Однако это возвращает только проекты, в которых есть хотя бы одна решенная проблема, мне нужно, чтобы это возвращало проекты, в которых также есть 0 решенных проблем.
Прошло некоторое время с тех пор, как я работал с MySQL, кто-нибудь может помочь? Спасибо.
Я подумал, что дам немного больше информации, поскольку я еще не получил рабочего ответа. Если бы у меня было четыре проекта и по одной проблеме для каждого проекта, причем две из этих проблем были «решены», я бы ожидал, что запрос вернет:
project_name | count(*)
--------------------------
first_project | 1
second_project | 0
third_project | 0
fourth_project | 1
Однако запрос возвращает только те проекты, в которых есть хотя бы одна решенная проблема.
project_name | count(*)
-------------------------
first_project | 1
fourth_project | 1
Комментарии:
1. Я бы подумал, что простое изменение
count(*)
наcount(issues.*)
было бы тем, что вы ищете, верно?2. @Robert это выдает мне синтаксическую ошибку.
Ответ №1:
измените свой запрос на:
SELECT p.name, count(i.*)
FROM PROJECTS p
LEFT JOIN ISSUES i ON p.id = i.project_id
AND i.status = 'resolved'
GROUP BY projects.name
наличие «status = ‘resolved'» в предложении where привело к возврату только тех проектов, в которых была хотя бы одна проблема
Комментарии:
1. Дженсон В моих тестовых данных есть одна решенная проблема: этот запрос возвращает все проекты, причем каждая возвращаемая запись имеет разрешенное количество, равное единице.