MySQL:GROUP_CONCAT结果的条件?

时间:2014-06-30 22:15:04

标签: mysql database join group-concat

我的SQL设置类似于以下内容:

制品

  • id(PK)
  • 名称

标签

  • id(PK)
  • 标签

...以及第二个记录两者之间关联的表,因为每篇文章可以有多个标签:

ARTICLE_TAG_ASSOCS

  • id(PK)
  • article_id(FK)
  • tag_id(FK)

问题:如何查找具有特定标记的文章?

我能想出的最好的是:

SELECT
    name, GROUP_CONCAT(CASE WHEN tag = 'some-tag' THEN tag ELSE NULL END) AS tags
FROM
    articles, tags, article_tag_assocs
WHERE
    articles.id = article_id && tags.id = tag_id && tags IS NOT NULL
GROUP BY
    article_id

这是正确的;如果一篇文章没有标签" some-tag"然后该列在"标签中显示为空值"柱。 但是如何完全消除该行?

当然,我尝试追加

&& tags NOT LIKE '%some-tag%'

...到我的WHERE子句,在得知您无法在GROUP_CONCAT子句中使用WHERE别名之前。所以我尝试追加:

HAVING tags IS NOT NULL;

...对查询,结果相同,即MySQL表示它不识别列#34;标记"。

任何帮助表示感谢。

3 个答案:

答案 0 :(得分:1)

虽然我并不完全了解您的数据要求,但根据您提供的信息,GROUP_CONCAT似乎并不是您真正想要的。

但是anywhoo ..也许你可以使用子查询?

SELECT * FROM (
    SELECT
        name, GROUP_CONCAT(CASE WHEN tag = 'some-tag' THEN tag ELSE NULL END) AS tags
    FROM
        articles, tags, article_tag_assocs
    WHERE
        articles.id = article_id && tags.id = tag_id && tags IS NOT NULL
    GROUP BY
        article_id
) A where a.tags is not null

HAVING

    SELECT
        name, GROUP_CONCAT(CASE WHEN tag = 'some-tag' THEN tag ELSE NULL END) AS tags
    FROM
        articles, tags, article_tag_assocs
    WHERE
        articles.id = article_id && tags.id = tag_id && tags IS NOT NULL
    GROUP BY
        article_id
    HAVING
        GROUP_CONCAT(CASE WHEN tag = 'some-tag' THEN tag ELSE NULL END) IS NOT NULL

答案 1 :(得分:1)

  1. 使用正确的连接(语法现在已有25年历史)。
  2. 使用没有CASE等的直接条件。
  3. 为目标代码的 标记添加额外的联接。
  4. 我假设你想要所有标签,但至少有一个必须是some-tag

    SELECT name, GROUP_CONCAT(distinct t1.tag) AS tags
    FROM articles
    JOIN article_tag_assocs ON articles.id = article_id
    JOIN tags t1 ON t1.id = tag_id
    JOIN tags t2 ON t2.id = tag_id AND t2.tag = 'some-tag'
    GROUP BY name
    

答案 2 :(得分:1)

这个怎么样?

SELECT distinct a.name
FROM articles a join
     article_tag_assocs ata
     on a.id = ata.article_id join
     tags t
     on t.id = ata.tag_id
WHERE t.tag = 'some-tag';

它直接回答了你的问题。

请注意,这也会引入表别名。这些使查询更容易编写和阅读。