[英]MySQL: condition on result of GROUP_CONCAT?
我有一個類似於以下的SQL設置:
文章
TAGS
...和第三個表記錄兩者之間的關聯,因為每篇文章可以有多個標簽:
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”列中顯示為空值。 但是我怎樣才能完全消除那一行呢?
當然,我試着追加
&& tags NOT LIKE '%some-tag%'
...到我的WHERE
子句,在得知你不能在WHERE
子句中使用GROUP_CONCAT
別名之前。 所以我嘗試追加:
HAVING tags IS NOT NULL;
...對於查詢,具有相同的結果,即MySQL表示它不識別列“標簽”。
任何幫助贊賞。
雖然我不完全了解您的數據要求,但根據您提供的信息, 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
我假設你想要所有的標簽,但至少有一個必須是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
這個怎么樣?
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';
它直接回答了你的問題。
請注意,這也引入了表別名。 這些使查詢更容易編寫和閱讀。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.