2009-06-30 54 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。编号