Row Denormalizer /每行聚合行 - mysql

时间:2016-09-19 09:56:25

标签: mysql sql database

我试图对表中的某些数据进行非规范化处理,但我不能这样做,因为我找不到在mysql中正确执行的方法。

表:person_attribute

Attribute_ID Attribute
------------  ---------
1            Person Name
2            Person Age
3            Person Gender
.
.
.
34           Phone Number

34个属性就像现在一样,但它可能会发生变化。即我也可能获得其他属性。

表:person_data

Person ID fk_Attribute_ID Attribute_Value
--------- --------------- -------------
1          1              Max
1          2              55
1          3              male  
2          1              John
2          2              20
2          3              male  

例外输出:

Person ID Person Name Person Age Person Gender
--------- ----------- ---------- -------------
1           Max           55          male
2           john          20          male

我的解决方案:

Select 
Person ID, 
case when fk_Attribute_ID = ( select Attribute_ID from    person_attribute where Attribute_ID = 1) then Attribute_Value end as Person Name,case when fk_Attribute_ID = ( select Attribute_ID from    person_attribute where Attribute_ID = 2) then Attribute_Value end as Person Age,case when fk_Attribute_ID = ( select Attribute_ID from    person_attribute where Attribute_ID = 3) then Attribute_Value end as Person Gender From person_attribute left join on person_data (Attribute_ID  = fk_Attribute_ID)

Person ID Person Name Person Age Person Gender
--------- ----------- ---------- -------------
1           Max           null          null
1           null          55            null
1           null          null          male
2           john          null          null
2           null          20            null
2           null          null          male

请帮助我除外输出。 感谢

1 个答案:

答案 0 :(得分:1)

这样做是个好主意。这甚至不是非规范化;结果表仍然是标准化的(即没有冗余等)。

您想要的是每人聚合的行:

select 
  person_id,
  max(case when fk_attribute_id = 1 then attribute_value end) as person_name,
  max(case when fk_attribute_id = 2 then attribute_value end) as person_age,
  ...
from person_data
group by person_id;

当然,您需要了解构建此查询的所有属性。