Условие внутри GROUP_CONCAT () - PullRequest
4 голосов
/ 05 декабря 2011

Ребята, у меня есть следующие таблицы в моей БД

Места

  • id (первичный ключ)
  • имя

Проекты

  • id (первичный ключ)
  • location_id (внешний ключ => местоположения)
  • имя_проект

веха

  • id (первичный ключ)
  • имя

статусы

  • id (первичный ключ)
  • состояние

project_milestones

  • id (первичный ключ)
  • project_id (внешний ключ => проекты)
  • milestone_id (внешний ключ => вехи)
  • status_id (внешний ключ => статусы)

Здесь, для перечисления всех этапов (имеющих статус 9) всех проектов, я использую следующий запрос

SELECT projects.projectname, locations.name, DATE_FORMAT(projects.created_at, '%d-%m-%y') as     projectdate, 
 GROUP_CONCAT(milestones.name ORDER BY project_milestones.milestone_id ASC separator '<br/>')     AS milestones 
FROM projects INNER JOIN locations ON projects.location_id=locations.id 
INNER JOIN project_milestones ON project_milestones.project_id=projects.id  AND     project_milestones.status_id=9 
INNER JOIN milestones ON project_milestones.milestone_id=milestones.id 
INNER JOIN statuses ON project_milestones.status_id=statuses.id 
AND project_milestones.milestone_id=milestones.id GROUP BY  projects.projectname

Результат выглядит так

Location    Date Created    Project Name    Milestones (Status 9)
Bangalore   25-10-11        ABCD            CSO Contacts, Developer
Bangalore   11-11-11        Friday          Establish, Publish list
Bangalore   08-11-11        XX              CSO Contacts, Assemble,Layouts

Работает отлично, но мне нужен еще один столбец GROUP_CONCAT: Вехи (Статус 10) , чтобы отобразить все Вехи (имеющие статус 10) всех проектов.

Вывод, как и все проекты с перечисленными [Вехи состояния-9] и [Вехи состояния-10]. Как я могу это сделать?

1 Ответ

3 голосов
/ 05 декабря 2011
SELECT  *,
        (
        SELECT  GROUP_CONCAT(m.name ORDER BY m.id)
        FROM    project_milestones pm
        JOIN    milestones m
        ON      m.id = pm.milestone_id
        WHERE   pm.project_id = p.id
                AND pm.status_id = 9
        ) milestone_9,
        (
        SELECT  GROUP_CONCAT(m.name ORDER BY m.id)
        FROM    project_milestones pm
        JOIN    milestones m
        ON      m.id = pm.milestone_id
        WHERE   pm.project_id = p.id
                AND pm.status_id = 10
        ) milestone_10
FROM    projects p
JOIN    locations l
ON      l.id = p.location_id
...