MySQL:GROUP_CONCAT 结果的条件?

Posted

技术标签:

【中文标题】MySQL:GROUP_CONCAT 结果的条件?【英文标题】:MySQL: condition on result of GROUP_CONCAT? 【发布时间】:2014-08-21 09:26:49 【问题描述】:

我有一个类似于以下的 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”列中显示为空值。 但我怎样才能完全消除该行?

当然,我尝试追加

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

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

HAVING tags IS NOT NULL;

...查询,结果相同,即 mysql 说它不识别列“tags”。

任何帮助表示赞赏。

【问题讨论】:

sqlfiddle.com/#!2/a2581/27011 --- HAVING 非常适合您的情况 【参考方案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

【讨论】:

谢谢 - 它教会了我一些关于使用子查询的知识,并且确实奏效了。【参考方案2】:
    使用正确的连接(语法已经有 25 年历史了)。 使用没有 CASE 等的直接条件。 为目标标签添加一个额外的连接到标签just

我假设您想要所有标签,但至少有一个必须是 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

【讨论】:

【参考方案3】:

这个怎么样?

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';

它非常直接地回答了你的问题。

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

【讨论】:

@Utkanos 。 . .如果您查看 SQL Fiddle 中的数据,ids 不匹配,因此上述查询产生了正确的结果 (sqlfiddle.com/#!2/348aa/4)。 是的,我自己也发现了这一点,现在我已经开始工作了。非常感谢。

以上是关于MySQL:GROUP_CONCAT 结果的条件?的主要内容,如果未能解决你的问题,请参考以下文章

mysql中的group_concat与“case when”条件

Mysql count group_concat 高级用法(count 过滤条件,group_concat过滤条件)

MySQL GROUP_CONCAT 中的条件

mysql查询结果拼接group_concat

mysql查询结果拼接group_concat

MySQL 截断 GROUP_CONCAT 函数的连接结果