【问题标题】:How to transform (or possibly pivot) these MySQL results into a consolidated view?如何将这些 MySQL 结果转换(或可能将其转换)为统一视图?
【发布时间】:2016-09-07 09:51:50
【问题描述】:

MySQL 查询的结果如下所示:

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

如何将结果转换成这个?

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

我更喜欢 SQL 解决方案,但结果被传递到 PHP 中,因此如果没有 SQL 解决方案,我可以使用 PHP 操作结果。我不太愿意使用 PHP,但是因为我觉得对于 key 列中可能有一千个或更多不同值的查询来说,它会很慢。

当我在 Google 上搜索答案时,我听说过使用“透视”一词。我不完全理解这意味着什么,所以我不确定旋转是否在这里相关。

提前感谢您的任何建议。

【问题讨论】:

  • 在 PHP 中执行此操作会更具可扩展性和灵活性。所以,我不明白你的不情愿。
  • 尝试大小写或解码sql函数
  • @Strawberry 我不怀疑它在 PHP 中会更具可扩展性和灵活性,但我认为它会更慢。可扩展性、灵活性和速度(尽管相关)并不相同。在这种情况下,速度是我的主要驱动力。
  • @Avi 谢谢,我会研究这些功能。
  • @OhFiddyYouSoWiddy 如果结果仍然传递给 PHP,那么我怀疑您的担忧是没有根据的。但是,如果我错了,那么根据我的经验,一系列 LEFT JOIN 将(非常)略微优于 GL 的建议。

标签: mysql sql select pivot pivot-table


【解决方案1】:

只使用条件聚合:

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。

【讨论】:

  • 感谢您的回答。我会测试一下。
  • 谢谢。那工作得很好。我已将自己的答案添加为其他人的记录,但您的答案当然会被接受。
【解决方案2】:

虽然 Gordon Linoff 的解决方案是公认的答案,但我决定添加一个示例来说明我是如何实现它的。这应该对以后偶然发现这个问题的人有所帮助!

-- 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`;

【讨论】:

    猜你喜欢
    • 2015-02-14
    • 2023-03-19
    • 2015-10-07
    • 1970-01-01
    • 2018-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-09
    相关资源
    最近更新 更多