关于sql:如何将这些MySQL结果转换(或可能转换为一个合并视图)?

How to transform (or possibly pivot) these MySQL results into a consolidated view?

MySQL查询的结果如下:

1
2
3
4
5
6
7
key | name | value
----+------+--------
1   | foo  | alpha
1   | bar  | beta
2   | foo  | charlie
2   | bar  | delta
3   | foo  | echo

如何将结果转换为此?

1
2
3
4
5
key | foo     | bar
----+---------+--------
1   | alpha   | beta
2   | charlie | delta
3   | echo    |

我更喜欢SQL解决方案,但是结果被传递到PHP中,因此如果没有SQL解决方案,我可以使用PHP操纵结果。我不愿意使用PHP,但是我感觉对于key列中可能有成千上万个不同值的查询来说,它会非常慢。

当我在Google上搜索答案时,我听说过使用"旋转"一词。我不完全理解这是什么意思,因此我不确定是否在此处进行透视。

提前感谢您的任何建议。


尽管戈登·利诺夫(Gordon Linoff)的解决方案是公认的答案,但我决定添加一个示例来说明如何实现它。这将对以后偶然遇到此问题的任何人有所帮助!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
-- create a table
CREATE TABLE `items` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`uuid` INT NOT NULL,
`key` VARCHAR(255) NOT NULL,
`value` VARCHAR(255) NULL DEFAULT NULL,
PRIMARY KEY (`id`)
);

-- insert some rows
INSERT INTO `items` (`id`, `uuid`, `key`, `value`) VALUES ('1', '1', 'name', 'Foo');
INSERT INTO `items` (`id`, `uuid`, `key`, `value`) VALUES ('2', '1', 'price', '100');
INSERT INTO `items` (`id`, `uuid`, `key`, `value`) VALUES ('3', '2', 'name', 'Bar');
INSERT INTO `items` (`id`, `uuid`, `key`, `value`) VALUES ('4', '2', 'price', '200');
INSERT INTO `items` (`id`, `uuid`, `key`, `value`) VALUES ('5', '3', 'name', 'Baz');

-- and fetch them
SELECT `uuid`,
MAX(IF((`key` = 'name'), `value`, NULL)) AS `name`,
MAX(IF((`key` = 'price'), `value`, NULL)) AS `price`
FROM `items`
GROUP BY `uuid`;

只需使用条件聚合:

1
2
3
4
5
select `key`,
       max(case when name = 'foo' then value end) as foo,
       max(case when name = 'bar' then value end) as bar
from t
group by `key`;

如果每个key具有多个值,则group_concat()可能比max()更合适。

如果您不知道可能的名称列表,请使用Google" MySQL动态枢纽"作为示例。这需要使用动态SQL。