2013-08-06 144 views
0

您好我有2 MySQL表如下:Mysql的交叉表連接

項目

id item_name user_id 
1 test1  1  
2 test2  1 
3 test3  1 
4 test4  1 

項目

id user_id items 
1 1  1,3 
2 1  2,4 

如何可以編寫一個連接查詢,可以在一個項目中返回每個項目?

project1 => 
    item1=> 
     [id1] => 
     [name1] => 
    item3=> 
     [id3] => 
     [name3] => 

謝謝。

UPDATE 項目TBL enter image description here

項目TBL enter image description here

+0

什麼類型的呢檢索項'items'屬性有? – Nerius

+0

爲什麼你會在項目表中添加項目作爲逗號分隔值? –

+0

如果你可以創建第三個表格project_item,它會容易得多。 – Alex

回答

3

所有首先不存儲分隔的值的字符串在你的數據庫。通過正常維護和查詢數據的手段來限制自己。規範化你的數據(在這種情況下,通過引入project_items表和project_iditem_id列)。它將長期支付大量時間。

在此同時,您可以使用FIND_IN_SET()加入你的表

SELECT p.id project_id, p.user_id, i.id item_id, i.item_name 
    FROM project p LEFT JOIN items i 
    ON FIND_IN_SET(i.id, p.items) > 0 
    AND p.user_id = i.user_id 
ORDER BY p.id, i.id 

輸出:

 
| PROJECT_ID | USER_ID | ITEM_ID | ITEM_NAME | 
---------------------------------------------- 
|   1 |  1 |  1 |  test1 | 
|   1 |  1 |  3 |  test3 | 
|   2 |  1 |  2 |  test2 | 
|   2 |  1 |  4 |  test4 | 

這裏是SQLFiddle演示

UPDATE:的items數值應不包含空格。無論是刪除它們,或使用REPLACE()這樣

ON FIND_IN_SET(i.id, REPLACE(p.items, ' ', '')) > 0 

這裏是SQLFiddle演示

+0

用戶標識怎麼樣? – d3bug3r

+0

@zlippr只需將其添加到連接條件即可。我已經更新了答案和sqlfiddle示例以反映這一點。 – peterm

+0

但我只得到一個結果..爲什麼這樣?這是查詢SELECT p.id project_id,i.id,i.item_name FROM jr5t3_jblance_project p JOIN jr5t3_jblance_item i ON FIND_IN_SET(i.id,p.items)> 0 ORDER BY p.id,i。ID – d3bug3r

0

你的做法是不好的。您必須在項目和項目之間創建關係表。在記錄中包含逗號後跟隨的值列表不是一個好主意。

你應該創建一個名爲附加表的關係:project_items

,你可以使用下面的句子,從一個項目

select project_items.id_project, items.item_name, items.user_id 
from project_items 
left join items on project_items.id_item = items.id 

這是一個更好的辦法