2012-08-23 61 views
2

我有場叫功能,因爲我存儲的值作爲逗號分隔值,現在在選擇我需要獲取逗號分隔谷的相應的名稱如何獲取逗號分隔值的相應記錄?

table1- feature 

id feature_names 
1  A 
2  B 
3  C 
4  D 
5  E 

table2- car 

id car feature_ids 

1 Zen 2,3,4 // features = B,C,D 
2 Benz 1,2  // features = A,B 
3 Audi 4,5  // features = D,E 

如何獲得分離逗號相應的名稱選擇車表時的數值?

回答

2

重新設計您的數據庫。

  • 功能 - ID,名稱
  • 汽車 - ID,名稱
  • car_feature - car_id,FEATURE_ID

之後,您可以在查詢中使用JOIN 。事情是這樣的:

SELECT car.*, feature.name FROM car 
    JOIN car_feature ON car_feature.car_id = car.id 
    JOIN feature ON feature.id = car_feature.feature_id 

你不應該使用這樣的關係數據庫逗號分隔的字段。當然不是,如果你想根據該字段編寫查詢。即使它看起來有效,它也會很快變得非常低效,無法維護。

您的場景被稱爲表格之間的多對多關係 - 汽車可以具有任何功能,並且功能可以屬於任何汽車。我概述的技術稱爲交叉引用表。我已經給所有關鍵字爲你尋找正確的MySQL的教程和文章,例如:

+1

這是一個典型的多對多關係 http://en.wikipedia.org/wiki/Many-to-many_(data_model) – eldblz

-1
SELECT car FROM table2 WHERE feature_ids LIKE '%3%' 
+3

這將如何返回table1中的名稱? –

1

你可以嘗試以下方法:

select 
    a.id, 
    a.car, 
    group_concat(b.feature_names) as Features 
from 
    car a 
     join feature b 
      on b.id in (cast(b.feature_ids as char)); 

話雖如此,你真的不應該使用CSV在你的數據庫中。每個功能取一行,並在汽車表表中有一些額外的行。