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 中的数据,id
s 不匹配,因此上述查询产生了正确的结果 (sqlfiddle.com/#!2/348aa/4)。
是的,我自己也发现了这一点,现在我已经开始工作了。非常感谢。以上是关于MySQL:GROUP_CONCAT 结果的条件?的主要内容,如果未能解决你的问题,请参考以下文章
mysql中的group_concat与“case when”条件