2012-10-29 64 views
-1

我想從MySQL數據庫獲取它們連接的文章和所有標籤名稱。我的SQL代碼:從數據庫中獲取文章以及連接標籤的最佳方式

CREATE TABLE articles (
    id INT UNSIGNED NOT NULL AUTO_INCREMENT, 
    PRIMARY KEY (id) 
) 

CREATE TABLE tags (
    id INT UNSIGNED NOT NULL AUTO_INCREMENT, 
    name VARCHAR(25) NOT NULL, 
    PRIMARY KEY (id) 
) 

CREATE TABLE connections (
    art_id INT UNSIGNED NOT NULL, 
    tag_id INT UNSIGNED NOT NULL 
); 

我應該執行一些查詢還是製作一個大的查詢?我怎樣才能達到目的?我試圖玩JOIN,但似乎不能這樣做。

PS。我一直在尋找,但是SO上沒有任何確切的問題。

回答

1
select a.id, group_concat(t.name) as tags 
from articles a 
left join connections c on c.art_id = a.id 
left join tag t on t.id = c.tag_id 
group by a.id 

該查詢返回依照第1行,group_concat()將返回所有連接標記的名稱爲comma delimited list(或空,如果沒有連接的標記)。

+0

完美地工作,謝謝 – Jason

0

試試這個

select a.(*),t.name from articles a 
    inner join connection c on a.id=c.art_id 
    inner join tags t on c.tag_id=t.id 
0
SELECT articles.*,tags.* FROM articles , tags,connections 
where tags.id=connections.tag_id and articles.id=connections.art_id 
1

你的一個偉大的開始 - 但有幾件事情可以在這裏優化。

我們還假設你的Article表有一個ID和一個Title字段(只是爲了增加一些spice到這個查詢)。

要簡單地回答你的問題:

Select a.ID "ID", a."Title" "Title", t.Name "Tag_Name" 
From connections c 
    Left Join article a 
    on a.id = c.art_id 
    Left Join tags t 
    on t.id = c.tag_id 
-- If you want to filter on a certain article ID 
WHERE a.id = @SomeArticleParam 

我真的建議有兩件事情來優化這些表:

  1. 由於連接直接鏈接的文章和標籤,我就外鍵引用添加到連接表。這是一個很好的鏈接:foreign key link
  2. 索引您的連接表 - 這將允許在引用特定標籤或文章時更快的查詢。唯一索引將有助於防止在連接表中添加重複的文章/標籤對。這裏是一個很好的鏈接,讓你開始:index link
+0

+1,謝謝,我會檢查出來 – Jason

相關問題