совокупные трудности mysql

#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. Дженсон В моих тестовых данных есть одна решенная проблема: этот запрос возвращает все проекты, причем каждая возвращаемая запись имеет разрешенное количество, равное единице.