2013-12-23 39 views
1
拉逗號分隔值

我有表tbl_restaurant(姓名,cuisine_id,....)和tbl_cuisine(cuisine_id,cuisine_name)如何使用加入該從MySQL

在tbl_restaurant,cuisine_id場包含逗號(,)分隔值如(3,6,9,20,31) ,當我嘗試使用連接拉烹飪名稱時,它只需要第一個ID(即:3)在上述情況下。 我有疑問:

SELECT tbl_restaurant.name, tbl_restaurant.cuisine_id, tbl_cuisine.cuisine_id, 
tbl_cuisine.cuisine_name 
FROM tbl_restaurant 
LEFT JOIN tbl_cuisine ON tbl_restaurant.cuisine_id = tbl_cuisine.cuisine_id 
WHERE tbl_restaurant.published =1 
AND tbl_restaurant.id =$id 

我應該解析之前使用連接或其他嗎?請提出任何建議。

+1

的* 「正確的」 *的方法是固定的模式是正確的正常化。做一次修正,然後JOIN被固定(並且微不足道並且可能更快)更多。要跟上這種非規範化的方法(ick!ick!),請參閱http://stackoverflow.com/questions/10895764/mysql-join-comma-separated-field?rq=1以及類似內容。 – user2864740

+1

將逗號分隔的值存儲在數據庫列中確實不是一個好主意,因爲它給你這麼多問題,並且會影響性​​能,因爲它不能用索引搜索;但MySQL函數[FIND_IN_SET()](http://dev.mysql.com/doc/refman/5.6/en/string-functions.html#function_find-in-set)可能有助於 –

+0

http://en.wikipedia .org/wiki/First_normal_form – GordonM

回答

2

您可以使用FIND_IN_SET()函數來連接兩個表。

試試這個:

SELECT r.name, r.cuisine_id, GROUP_CONCAT(c.cuisine_name) 
FROM tbl_restaurant r 
LEFT JOIN tbl_cuisine c ON FIND_IN_SET(c.cuisine_id, r.cuisine_id) 
WHERE r.published =1 AND r.id = $id 
GROUP BY r.id; 

檢查SQL FIDDLE DEMO

輸出

| NAME | CUISINE_ID | GROUP_CONCAT(C.CUISINE_NAME) | 
|------|------------|------------------------------| 
| abc | 1,2,6,8 | Nepali,Indian,Thai,Korean | 
+0

這不會縮放會。 100條記錄可能很好,甚至可能有1000條記錄,但100,000條記錄呢?正確的解決方案是將架構修復爲1NF。它特別糟糕,因爲一列將是一個整數,但另一列必須是某種類型的字符類型,所以在那裏還有一個隱式轉換,索引的使用是有限的,如果有的話。 – GordonM

+0

我已經使用這個功能,但它給出相同的輸出,即只有一個ID。沒有正常化沒有任何解決方案? –

+0

@ Tnd.exe請提供來自表格和期望輸出的一些示例數據。 –

1

使用FIND_IN_SET和GROUP_CONCAT

SELECT r.name, r.cuisine_id, GROUP_CONCAT(c.cuisine_name) 
FROM tbl_restaurant r 
LEFT JOIN tbl_cuisine c ON FIND_IN_SET(c.cuisine_id, r.cuisine_id) 
WHERE r.published =1 AND r.id = $id 
GROUP BY r.id; 

輸出:

| NAME | CUISINE_ID | GROUP_CONCAT(C.CUISINE_NAME) | 
|------|------------|------------------------------| 
| abc | 1,2,6,8 | Nepali,Indian,Thai,Korean |