2012-12-03 135 views
0

我在數據庫中有2表:mainTable和classificationTable:MySQL的選擇與子查詢

mainTable:

id | classification_id | name 
--------------------------------------- 
1 |   1   | Name1 
2 |   2,3,4  | Name2 
3 |   1,4   | Name3 
4 |   4   | Name4 

classificationTable:

classification_id | class_name 
--------------------------------------- 
     1   | Class Name1 
     2   | Class Name2 
     3   | Class Name3 
     4   | Class Name4 

我希望得到一個選擇,例如用於來自mainTable的ID 3的行,如:

id   = 3 
class_name = Class Name1, Class Name4 
Name  = Name3 

我嘗試此選擇,但是這僅返回首先從陣列elemnt(前exempla用於行與ID 3,該返回唯一的類名1)

SELECT i.*, 
(SELECT GROUP_CONCAT(cl.class_name) FROM classificationTable as cl WHERE cl.classification_id IN(i.classification_id)) as class_name 
FROM mainTable as i; 

幫助PLZ。

+0

哪裏是classification_name在你的桌子嗎? –

+0

對不起,是我的錯。是class_name –

回答

1

是的,你有一個設計不佳的數據庫。但你可以做你想做的。

這需要兩個步驟。第一種方法是通過在mainTable的列表中查找每個classification_id來將mainTable連接到classificationTable。您可以使用like運算符來執行此操作。

第二步是將所有類名稱放回一列。這是使用group_concat處理的。

下面的查詢實現這個(雖然沒有測試過,所以它可能有一個錯字):

select mt.id, mt.name, group_concat(ct.class_name separator ', ') 
from mainTable mt join 
    classificationTable ct 
    on concat(',', classification_id, ',') like concat('%,', ct.classification_id, ',%') 
group by mt.id, mt.name 
+0

我明白了mainTable中的classification_id。您的解決方案完美運作感謝幫助。 –

+0

@AlexandruPara,考慮將此(或另一個)答案標記爲已接受,您的分數也會上升 – amphibient

1

的問題是你的mainTable,這不僅違反了the 1st normal form但甚至超越,因爲它串接在同一個字段值(的1NF違規往往包括多個領域,這是夠糟糕的典型例子)。

classification_id列不應該是值的串聯,但應該有一個新的表,其中每個classification_id都有一個單獨的行,並且它應該通過id綁定到mainTable中。

E.g.

id | classification_id 
--------------------------------------- 
1 |   1   
2 |   2   
2 |   3   
2 |   4   
3 |   1  
3 |   4  
4 |   4  

一旦你這樣做了,你的查詢將會容易得多。