2011-03-14 37 views
1

我有問題列出文章和它們各自的標籤,也許有人可以幫助我。加入1個MySQL行與幾個結果

想象查詢:

select *.articles, tags.tag_name 

from articles 

left join tags on tags.article_id = articles.article_id 

where articles.article_id = 1 

這將正常工作,如果文章只有一個標籤。問題是如果文章有超過1個標籤,那麼對於同一篇文章,每個標籤會得到1行。如果我想在這篇文章中展示這些文章,那麼它就會顯示給許多相同的文章。

有沒有辦法將它保存在一行中,還是需要使用兩個查詢:一個用於文章信息,另一個用於標籤?這將是不好的,因爲50個artciles列表需要50個查詢來顯示他們的標籤。

回答

0

如果一篇文章可以有多個標籤,則必須創建一個包含文章和標籤ID的中間表,這樣您就可以鏈接許多帶有多個標籤的文章。

然後將查詢將

select *.articles, tags.tag_name 

from articles 

inner join rel_tags on articles.article_id = rel_tags.article and articles.article_id = 1 

inner join tags on rel_tags.tag = tags.tag_id 
+0

是的我有一張關係表。我嘗試了你的「內在」方式,但得到同樣的問題,2篇文章和2個標籤每個給我4行。 – 2011-03-14 17:46:11

+0

對不起,我誤解了,看來GROUP_CONCAT是最好的方式,但我不明白你的行爲... – MatTheCat 2011-03-14 22:36:46

0

你可以使用GROUP_CONCAT它默認返回一個逗號分隔在你的分組表達式值的列表。例如。

select a.article_id, GROUP_CONCAT(t.tag_name) 
from articles a 
    left join tags t using (article_id) 
where a.article_id = 1 
group by a.article_id 

或者運行與加盟,並得到重複的商品信息,然後你就可以以編程方式重新組合的一個查詢。這可以通過使用ORM來自動完成。

+0

這隻適用於如果我只想看一篇文章。我想在1個查詢中找到包含其標籤的文章列表。 – 2011-03-15 00:27:42

+0

如果你想要所有的文章,那麼只需刪除where子句,它將它限制爲一篇文章(按照原始查詢)。 – 2011-03-15 12:46:11

+0

嘿,謝謝,但如果我刪除where子句,我仍然得到1行和每個文章的所有標籤分組在一個列。我想要的是每篇文章有1行,併爲該文章分組標記,也許我應該提出一個新問題? grrr:P – 2011-03-15 22:50:12

0

可以使用GROUP_CONCAT()功能:

SELECT *.articles, GROUP_CONCAT(tags.tag_name) 
FROM articles 
LEFT JOIN tags ON tags.article_id = articles.article_ID 
WHERE articles.article_id = 1 
GROUP BY articles.article_id 

這將那些多餘的行轉換成一個單一的領域。

+0

我想這會工作,問題是我想顯示文章列表和他們各自的標籤。不只是文章ID 1.如果我嘗試沒有文章ID 1部分它只返回1(第一篇文章)行併合並所有標籤在1場嘿嘿 – 2011-03-14 17:42:06