键值对,每个键的列,键作为列标题

时间:2014-01-16 16:40:40

标签: mysql pivot-table entity-attribute-value

我有一个像这样的表field_list:

field_id|obj_id|field_key|field_content
----------------------------------------    
     1  |   1  |   123   |   Title_A
     2  |   1  |   234   |   IP_A
     3  |   1  |   567   |   DNS_A
     4  |   2  |   123   |   Title_B
     5  |   2  |   456   |   IP_B
     6  |   2  |   789   |   DNS_B
     7  |   3  |   123   |   Title_C
     8  |   3  |   456   |   IP_C
     9  |   3  |   789   |   DNS_C

我需要的是:

obj_id  |123    |456  |789
----------------------------------------    
    1   |Title_A|IP_A |DNS_A
    2   |Title_B|IP_B |DNS_B
    3   |Title_C|IP_C |DNS_C

我有几个想法,如何实现这一点(创建新表或视图,使用scirpts等)。不幸的是,我的SQL技能不是很专业,我不知道我是否朝着正确的方向努力。

背景: mySql数据库用于存储有关网页的信息。有一个表'obj'和一个表'field_list'。 'obj_id'是来自obj表的外键。 'field_id'是field_list的主键。

我设法通过连接和分隔得到了我想要的东西,但不是很多列的结果。

如果没有简单的答案,或许多人 - 也许有人可以引导我走向正确的方向。

请原谅我糟糕的英语和语法。这是我的第一个stackoverflow问题 - 我希望你能耐心等待我。如果事情不明确,我明天会修改我的问题。

THX!

1 个答案:

答案 0 :(得分:3)

你可以尝试这样的东西,但性能可能不完美......

这个表模型在搜索时非常好,而不是它的表列表示:

SELECT object_id,
MAX( IF( field_key = 123, field_content, NULL) ) AS col_123,
MAX( IF( field_key = 234, field_content, NULL) ) AS col_234,
MAX( IF( field_key = 345, field_content, NULL) ) AS col_345,
MAX( IF( field_key = 456, field_content, NULL) ) AS col_456,
MAX( IF( field_key = 567, field_content, NULL) ) AS col_567
FROM field_list
GROUP BY object_id