繁体   English   中英

SQL查询以形成数据

[英]A sql query to form data

MySQL的:

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

未知Table_B中存在多少个类型值。

如何获得结果为:

id  name  width height  color
1  Name1  100  100      red
2  Name2  50    80      null
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的表,该表具有width / height / color列。 或者有一个名为Size的表,该表具有宽度/高度列,而又有一个名为Color的表,具有颜色名称或RGB值。 当然,每个其他表都具有TableA的FK,可以或可以不用作该表的PK。

好吧,我不建议对数据库使用EAV反模式,因为它基本上将非结构化数据保存在结构化数据库中,但是我之前不得不与之抗衡,所以这比内部联接要快得多

选择a.id,a.name,max(当b.type ='height'然后b.value结束时的情况)作为高度,max(当b.type ='width'然后b.value结束时的情况)作为宽度,最大(如果b.type ='color'然后b.value结束的情况)为test.tablea a,test.tableb b中的颜色,其中a.id = b.a_id由a.id分组

将选择查询与子查询一起使用

像select id,Name(从table_B选择类型,其中a_id = table_A.id并选择type ='width')作为table_A的宽度

像这样,您可以添加其他需要的列

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM