我试图对表中的某些数据进行非规范化处理,但我不能这样做,因为我找不到在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
请帮助我除外输出。 感谢
答案 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;
当然,您需要了解构建此查询的所有属性。