我的SQL设置类似于以下内容:
制品
标签
...以及第二个记录两者之间关联的表,因为每篇文章可以有多个标签:
ARTICLE_TAG_ASSOCS
问题:如何查找具有特定标记的文章?
我能想出的最好的是:
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;标记"。
任何帮助表示感谢。
答案 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)
我假设你想要所有标签,但至少有一个必须是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';
它直接回答了你的问题。
请注意,这也会引入表别名。这些使查询更容易编写和阅读。