关于sql:不使用UNIONS,用MySQL将一行转成列?

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 之类的东西。我将不胜感激任何对我遗漏的东西的洞察力。

马哈茂德

附言

我正在考虑将数据库的重新规范化作为最后的选择,因为这不是一项简单的任务。

谢谢!


我从《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);

现在在 foopivot 之间进行笛卡尔连接,使用 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 像这样进行转置(尽管它可能会执行得很糟糕)。所以我确信我们可以找到一种正确的方法。