查询产生的MySQL raarrange结果

时间:2018-07-02 04:22:13

标签: mysql mysqli pivot

这是我的表格,其中包含示例数据:

|  attr_key  |  attr_value  |  element_id  |<br>
|    color   |    black     |     1        |<br>
|    color   |    red       |     2        |<br>
|    color   |    green     |     3        |<br>
|    power   |    82        |     1        |<br>
|    power   |    150       |     2        |<br>
|    power   |    240       |     3        |<br>
| and so on ...

如何查询此表以得到如下结果:

|  color  |  power  |  element_id  |<br>
|  black  |  82     |    1         |<br>
|  red    |  150    |    2         |<br>
|  green  |   240   |    3         | 

GROUP BY不起作用,因为它仅对每个element_id采用第一个属性,而其他属性则丢失。

我必须创建一个视图吗?

将属性直接放入我的elements表中,例如在JSON字段中?这些属性是非常可变的,因此每个元素可能有很多属性(超过20个),我不确定在必须查询和检查特定属性(全部或仅几个)时哪种解决方案会更好。

稍后我想使用elements联接另一个表(element_id)。

1 个答案:

答案 0 :(得分:0)

这将满足您的需要(将“ test_table”的所有实例替换为表名):

SELECT
    sub1.`color` AS `Color`,
    sub2.`power` AS `Power`,
    sub1.`element_id` AS `Element ID`
FROM
    (SELECT element_id, attr_value AS `color` FROM test_table WHERE attr_key = 'color') AS sub1
INNER JOIN
    (SELECT  element_id, attr_value AS `power` FROM test_table WHERE attr_key = 'power') AS sub2
    ON
    sub1.element_id = sub2.element_id

我用来设置测试的代码:

DROP TABLE IF EXISTS test_table;
CREATE TABLE IF NOT EXISTS test_table(
    element_id int,
    attr_key varchar(40),
    attr_value varchar(40)
);

INSERT INTO 
    test_table 
        (attr_key, attr_value, element_id)
    VALUES
        ('color', 'black', 1),
        ('color', 'red', 2),
        ('color', 'green', 3),
        ('power', '82', 1),
        ('power', '150', 2),
        ('power', '240', 3);