2014-04-25 80 views
0

嗨什麼是這個結果正確的查詢:MySQL查詢的項目列表視圖與標籤

+---------------------------------------+ 
item_id | item_title | tag_list   | 
----------------------------------------+ 
1  | Title 1 | tag1 , tag2, tag3| 
2  | Title 2 | tag7 , tag2  | 
3  | Title 3 | tag9 , tag5, tag4| 
4  | Title 4 | tag7 , tag6, tag3| 
----------------------------------------- 

我有以下表格:

  • 項目 - > ITEM_ID(PK),ITEM_TITLE
  • 標籤 - > TAG_ID(PK),TAG_NAME(唯一的)
  • items_tags_xref - > items_tags_xref_id(PK),ITEM_ID,TAG_ID

SQL小提琴 - >http://sqlfiddle.com/#!2/33dea8/1

我嘗試沒有成功以下查詢:

SELECT 
items.item_id, 
items.title, 
(
    SELECT GROUP_CONCAT(DISTINCT tags.tag_name) 
     FROM tags 
      INNER JOIN items_tags_xref 
       ON tags.tag_id = items_tags_xref.tag_id 
      INNER JOIN items 
       ON items_tags_xref.item_id = items.item_id 
     WHERE items_tags_xref.item_id = items.item_id 

) AS tag_list 
FROM items 

上述查詢的結果顯示內tag_list

所有tag_names加,但如果我這樣做查詢:

SELECT 
items.item_id, 
items.title, 
(
    SELECT GROUP_CONCAT(DISTINCT tags.tag_name) 
     FROM tags 
      INNER JOIN items_tags_xref 
       ON tags.tag_id = items_tags_xref.tag_id 
      INNER JOIN items 
       ON items_tags_xref.item_id = items.item_id 
     WHERE items_tags_xref.item_id = 4 

) AS tag_list 
FROM items 

「4是一個特定的item_id」我只得到正確的結果f或該項目。如果只有4是動態的,當我使用items.item_id內tag_list ..

我試圖解決這個問題幾天,一直在谷歌尋找答案,但找不到任何東西。也許我使用錯誤的關鍵詞:(但如果有人能給我至少在如何做到這一點的權利小費。這將是非常有益的。謝謝!

  • PS我是新在MySQL
+0

恕我直言,沒有問題的GROUP_CONCAT是解決方案。相反,請考慮處理應用程序級別的數據顯示問題。也就是說,考慮提供合適的DDL(和/或一個sqlfiddle)與期望的結果集合在一起。 – Strawberry

+0

嗨,感謝您的快速響應我在這裏創建了一個SQL小提琴http://sqlfiddle.com/#!2/33dea8/1關於數據顯示我確定逗號分隔值..我只是想學習PHP和MySQL標記系統,我認爲這是一個很大的優點,如果我可以在一個查詢中做到這一點.. –

回答

0

我有點困惑,究竟該部分問題將執行以下操作不能解決?

SELECT i.* 
    , GROUP_CONCAT(tag_name) tags 
    FROM items i 
    JOIN items_tags_xref it 
    ON it.item_id = i.item_id 
    JOIN tags t 
    ON t.tag_id = it.tag_id 
GROUP 
    BY i.item_id; 

http://sqlfiddle.com/#!2/33dea8/6

此外,在ITE的代理鍵ms_tags_xref表似乎完全是多餘的,因爲其餘的列將作爲一個完全可行的複合自然主鍵

+0

我只需要結果列表,它幫助我..但我現在有一個問題,如果沒有標籤它贏了不包括在列表中。是否可以包含沒有標籤的項目? –

+0

是的。將[INNER] JOIN改爲LEFT [OUTER] JOINs http://sqlfiddle.com/#!2/0068f/2(我的模式與你的略有不同) – Strawberry