从查询中排列结果

n9vozmp4  于 2021-06-20  发布在  Mysql
关注(0)|答案(1)|浏览(280)

这个问题在这里已经有答案了

mysql-从行到列(12个答案)
两年前关门了。
这是我的表格和示例数据:

|  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` 不起作用,因为它只接受每个元素的第一个属性,\u id,而其他属性将丢失。
我必须创建一个视图吗?
将属性直接放入我的 `elements` -表,例如在json字段中?这些属性是非常可变的,所以每个元素可能有很多属性(超过20个),我不确定当我必须查询和检查特定属性(全部或只有少数)时,哪个解决方案的性能会更好。。
稍后我想加入另一个表( `elements` )使用 `element_id` .
mzaanser

mzaanser1#

这将满足您的需要(用表名替换“test\u 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);

相关问题