MySQL: опционально поле Build Group Concat - PullRequest
2 голосов
/ 08 декабря 2011

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

Я хочу выбрать все статьи в формате, указанном в SELECT, и, если статье также назначено любое количество тегов, поместите их в одно поле GROUP_CONCAT.

SQL ниже делает все, что мне нужно, за исключением , он извлекает только те статьи, которые имеют хотя бы один тег .

Как сделать так, чтобы требование тегирования было необязательным?

SELECT d.entry_id AS entry_id
   , d.field_id_40 AS body
   , t.title AS title
   , t.url_title AS url_title
   , t.entry_date AS entry_date
   , GROUP_CONCAT(g.tag_name ORDER BY g.tag_name) AS tag
FROM exp_channel_data d
   , exp_category_posts c
   , exp_channel_titles t
   , exp_tagger_links l
   , exp_tagger g
WHERE t.YEAR > '2005'
   AND t.site_id = d.site_id
   AND d.site_id = 9
   AND ( c.cat_id = 95
      OR c.cat_id = 93
      OR c.cat_id = 64
      OR c.cat_id = 24
   )
   AND d.entry_id = t.entry_id
   AND t.entry_id = c.entry_id
   AND t.STATUS = 'open'
   AND l.tag_id = g.tag_id
   AND d.entry_id = l.entry_id
GROUP BY d.entry_id

1 Ответ

3 голосов
/ 08 декабря 2011

Переключение JOINS для использования синтаксиса JOIN, это должно дать вам ответ.

SELECT d.entry_id AS entry_id
   , d.field_id_40 AS body
   , t.title AS title
   , t.url_title AS url_title
   , t.entry_date AS entry_date
   , GROUP_CONCAT(g.tag_name ORDER BY g.tag_name) AS tag
FROM exp_channel_data AS d
INNER JOIN exp_channel_titles AS t ON d.site_id = t.site_id
   AND d.entry_id = t.entry_id
INNER JOIN exp_category_posts AS c ON t.entry_id = c.entry_id
LEFT OUTER JOIN exp_tagger_links AS l ON d.entry_id = l.entry_id
LEFT OUTER JOIN exp_tagger AS g ON l.tag_id = g.tag_id
WHERE t.YEAR > '2005'
   AND d.site_id = 9
   AND c.cat_id IN (95, 93, 64, 24)
   AND t.STATUS = 'open'
GROUP BY d.entry_id

Вы также можете посмотреть Визуальное объяснение SQL-соединений.

...