Получение всех статей с полем GROUP_CONCAT их тегов - PullRequest
3 голосов
/ 27 августа 2010

У меня есть таблица articles, другая tags и третья с именем article_tags. Я хочу создать страницу со списком всех статей для определенного тега.

Мой запрос выглядит так:

SELECT headline, GROUP_CONCAT(tags.tag_name) AS all_tags FROM articles<br> LEFT JOIN articles_tags ON articles.article_id = articles_tags.article_id<br> LEFT JOIN tags ON articles_tags.tag_id = tags.tag_id<br> WHERE tags.tag_name = 'japan'<br> GROUP BY articles.article_id

Все возвращенные статьи имеют только japan в качестве тега, даже если в рассматриваемой статье есть несколько тегов.

Это, очевидно, связано с предложением WHERE, но я не могу понять, как сделать то, что я хочу здесь - в идеале я бы в итоге получил список типа japan,china,korea. Это место для подзапроса? Могли бы посоветоваться с SQL-гуру.

Спасибо, Matt

Ответы [ 2 ]

3 голосов
/ 27 августа 2010

Вы можете использовать как минимум два подхода.Один подход состоит в том, чтобы присоединиться к таблицам дважды.Другое, как вы указываете, это использовать подзапрос.Для простоты и удобства чтения я бы, вероятно, воспользовался здесь подзапросом.Результирующий запрос будет выглядеть примерно так:

SELECT
    headline,
    GROUP_CONCAT(tags.tag_name) AS all_tags
FROM articles
JOIN articles_tags ON articles.article_id = articles_tags.article_id
JOIN tags ON articles_tags.tag_id = tags.tag_id
WHERE articles.article_id IN (
    SELECT articles.article_id
    FROM articles
    JOIN articles_tags ON articles.article_id = articles_tags.article_id
    JOIN tags ON articles_tags.tag_id = tags.tag_id
    WHERE tags.tag_name = 'japan'
)
GROUP BY articles.article_id

И вот подход, использующий больше JOIN:

SELECT
    a.headline,
    GROUP_CONCAT(t2.tag_name) AS all_tags
FROM articles a
JOIN articles_tags at1 ON a.article_id = at1.article_id
JOIN tags t1 ON at1.tag_id = t1.tag_id AND t1.tag_name = 'tag1'
JOIN articles_tags at2 ON a.article_id = at2.article_id
JOIN tags t2 ON at2.tag_id = t2.tag_id
GROUP BY a.article_id;
2 голосов
/ 27 августа 2010

Использование EXISTS:

   SELECT a.headline,
          GROUP_CONCAT(t.tag_name) AS all_tags
     FROM ARTICLES a
LEFT JOIN ARTICLES_TAGS at ON at.article_id = a.article_id
LEFT JOIN TAGS t ON t.tag_id = at.tag_id
    WHERE EXISTS(SELECT NULL
                   FROM ARTICLES x
                   JOIN ARTICLE_TAGS y ON y.article_id = x.article_id
                   JOIN TAGS z ON z.tag_id = y.tag_id
                              AND z.tag_name = 'japan'
                  WHERE x.article_id = a.article_id)
 GROUP BY a.article_id

Нет необходимости использовать ЛЕВЫЕ СОЕДИНЕНИЯ в подзапросе, если вас интересуют только те, которые связаны с тегом "japan".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...