2014-06-30 56 views
0

我有一個SQL設置類似於如下:MySQL:GROUP_CONCAT結果的條件?

文章

  • ID(PK)

標籤

  • ID(PK)
  • 標籤

...和第三個表記錄兩者之間的關聯,因爲可以有多個標籤,每一篇文章:

ARTICLE_TAG_ASSOCS

  • ID(PK)
  • 的article_id(FK)
  • TAG_ID(FK)

問題1上:如何找到具有特定標籤的文章?

我能想出是最好的:

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的說,它不認列的「標籤」。

任何幫助表示讚賞。

+0

http://sqlfiddle.com/#!2/a2581/27011 ---'HAVING'完美適合您的情況 – zerkms

回答

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

它直接回答你的問題。

請注意,這也引入了表別名。這些使查詢更容易編寫和閱讀。

+0

@Utkanos。 。 。如果您查看SQL提琴中的數據,「id」不匹配,所以上面的查詢生成正確的結果(http://sqlfiddle.com/#!2/348aa/4)。 –

+0

是的,我剛剛發現,我自己,現在我已經得到了這個工作。非常感謝。 – Utkanos

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 
+0

即使沒有子查詢,它也必須正常工作。 – zerkms

+0

非常感謝 - 它教會了我使用子查詢的一些方法,並且確實有效。 – Utkanos

1
  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