2009-06-30 89 views
0

MySQL的:一個SQL查詢來形成數據

Table_A 
------------ 
id name 
1 Name1 
2 Name2 


Table_B 
------------ 
a_id type value 
1 width 100 
1 height 100 
1 color red 
2 width 50 
2 height 80 

它是未知的多少型表-B存在值。

如何獲得結果爲:

id name width height color 
1 Name1 100 100  red 
2 Name2 50 80  null 

回答

1
SELECT a.id, a.name, b_Width.value AS width, b_Height.value AS height, b_color.value AS color 
FROM Table_A AS a 
JOIN Table_B AS b_Width 
    ON b_Width.a_id = a.id AND b_Width.type = 'width' 
JOIN Table_B AS b_Height 
    ON b_Height.a_id = a.id AND b_Height.type = 'height' 
JOIN Table_B AS b_Color 
    ON b_Color.a_id = a.id AND b_Color.type = 'color' 

但認真考慮重新設計架構。值是持有顏色和線性尺寸的,如果設計不同,會更好。

保持TableA的方式,但是然後有一個名爲Details的表具有寬度/高度/顏色列。或者有一個名爲Size with width/height columns的表格和一個名爲Color的表格,顏色名稱或RGB值。每個額外的表格當然都有一個表格F的FK,可以或不可以用作表格的PK。與子查詢

像選擇ID,名稱

0

使用選擇查詢,(從表-B,其中A_ID = table_A.id選擇類型和類型=「寬度」)爲寬度從TABLE_A

相同這樣你可以添加你需要的另一列 好吧

1

那麼,我不會推薦使用EAV反模式的數據庫,因爲它基本上可以保存結構化數據庫中的非結構化數據,但是我必須先與之對抗一次,所以這裏是內部連接要快得多的東西

選擇a.id,a.name, MAX(情況下,當b.type = '高度' 然後b.value端)作爲高度, MAX(情況下,當b.type = '寬度' 則b。 value end)作爲寬度, max(b.type ='color'時b.value結束時)顏色 from test.tablea a,test.tableb b其中a.id = b.a_id group by a。編號