Transpose a row into columns with MySQL without using UNIONS?
我有一个类似于下面的表格:
1
2 |
id | cat | one_above | top_level |
0 ‘printers’ ‘hardware’ ‘computers’ |
我希望能够在不使用联合的情况下编写一个查询,它将返回一个结果集,该结果集将该表的列转换为行。这意味着,我希望结果是:
1
2 3 4 |
id | cat |
0 ‘printers’ 0 ‘hardware’ 0 ‘computers’ |
这在 MySQL 中可能吗?我无法下拉到应用程序层并执行此操作,因为我将这些输入到将基于 id 进行索引的搜索引擎中。其他各种 DBMS 都有 PIVOT 和 UNPIVOT 之类的东西。我将不胜感激任何对我遗漏的东西的洞察力。
马哈茂德
附言
我正在考虑将数据库的重新规范化作为最后的选择,因为这不是一项简单的任务。
谢谢!
- 在当前的 MySql 中不可能
- SQL Server 2005 和 Oracle 11g 已支持 PIVOT/UNPIVOT。我不知道任何其他支持该语法的数据库。
我从《SQL 的艺术》一书中得到这个,第 284-286 页:
假设你的表名是 foo.
首先,创建一个名为 pivot:
的表
1
2 3 |
CREATE TABLE pivot (
COUNT INT ); |
在该表中插入与要在 foo 中旋转的列一样多的行。由于 foo 中有三列要进行透视,因此在透视表中创建三行:
1
2 3 |
INSERT INTO pivot VALUES (1);
INSERT INTO pivot VALUES (2); INSERT INTO pivot VALUES (3); |
现在在 foo 和 pivot 之间进行笛卡尔连接,使用 CASE 根据计数选择正确的列:
1
2 3 4 5 6 |
SELECT foo.id, CASE pivot.count
WHEN 1 THEN cat WHEN 2 THEN one_above WHEN 3 THEN top_level END CASE FROM foo JOIN pivot; |
这应该会给你你想要的。
- 谢谢巴里,我要试试这样的东西,看看它是否有效。
经过一些相当广泛的挖掘后,我偶然发现了这个页面,它可能包含也可能不包含您的答案。这在 MySQL 中是一个难题,但从概念的angular来看,我可以构造一个查询,使用 describe 像这样进行转置(尽管它可能会执行得很糟糕)。所以我确信我们可以找到一种正确的方法。
来源:https://www.codenong.com/1851781/