簡體   English   中英

MySQL:GROUP_CONCAT結果的條件?

[英]MySQL: condition on result of GROUP_CONCAT?

我有一個類似於以下的SQL設置:

文章

  • id(PK)
  • 名稱

TAGS

  • 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表示它不識別列“標簽”。

任何幫助贊賞。

雖然我不完全了解您的數據要求,但根據您提供的信息, 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. 使用正確的連接(語法現在已有25年歷史)。
  2. 使用沒有CASE等的直接條件
  3. 添加額外加入到標簽只是為目標標簽。

我假設你想要所有的標簽,但至少有一個必須是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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM