Двойная GROUP_CONCAT с MySQL 5,6 - PullRequest
1 голос
/ 11 апреля 2020

У меня есть запрос, который сейчас забивает мне мысли.

Вот мой базовый c запрос:

SELECT e.id AS `equipment.id`, t.id AS `task.id`, ttr.tags_id AS `tag.id`
FROM equipment e
  LEFT JOIN task t ON t.equipment = e.id
  INNER JOIN task_tag_relationship ttr ON ttr.task_id = t.id
WHERE e.id = 14;

И его результат:

equipment.id  task.id   tag.id
14            10520     171
14            152040    171
14            223738    1
14            223738    4
14            331035    1
14            331035    4
14            1475152   1
14            1475152   4
14            1475152   5

То, что я хотел бы, - это конкатенировать tags.ids от каждого task с, скажем, ,, а затем конкатенировать эти конкатенированные tags.ids с ;:

equipment.id  tags.ids
14            171;171;1,4;1,4;1,4,5

Мне удалось сделать это с помощью следующего запроса:

SELECT GROUP_CONCAT(tags SEPARATOR ';') as `tags.ids`
FROM (
    SELECT GROUP_CONCAT(ttr.tags_id) as `tags`
    FROM task t
      INNER JOIN task_tag_relationship ttr ON ttr.task_id = t.id
    WHERE t.equipment = 14
    GROUP BY t.id
) as `task.tags`;

Но дело в том, что я не могу использовать этот запрос в запросе, подобном этому:

SELECT
  e.id, 
  SELECT GROUP_CONCAT(tags SEPARATOR ';') as `tags.ids`
  FROM (
    SELECT GROUP_CONCAT(ttr.tags_id) as `tags`
    FROM task t
      INNER JOIN task_tag_relationship ttr ON ttr.task_id = t.id
    WHERE t.equipment = e.id -- here's the problem, e.id is not available in the sub-subquery
    GROUP BY t.id
  ) as `task.tags`
FROM equipment e
WHERE e.id = 14

У меня есть я пытался сделать это с JOINs и GROUP BYs, но без лучших результатов.

Я, очевидно, мог бы сделать это в коде, но мне интересно, выполнимо ли это в MySQL.

Заранее спасибо!

1 Ответ

0 голосов
/ 11 апреля 2020

Вы были близки. Попробуйте это:

SELECT equipment, GROUP_CONCAT(tags SEPARATOR ';') as `tags.ids`
FROM (
  SELECT t.equipment, GROUP_CONCAT(ttr.tags_id) as `tags`
  FROM task t
    INNER JOIN task_tag_relationship ttr ON ttr.task_id = t.id
  GROUP BY t.equipment, t.id
) t
WHERE equipment = 14
GROUP BY equipment;
...