1

我有一个类似于下面的表:

       id |        cat |         one_above |        top_level | 
        0    'printers'          'hardware'        'computers'

我希望能够在不使用 unions的情况下编写一个查询,它将返回一个结果集,该结果集将该表的列转换为行。这意味着,我希望结果是:

       id |          cat |
        0      'printers'
        0      'hardware'
        0     'computers'

这在 MySQL 中可能吗?我无法下拉到应用程序层并执行此操作,因为我将这些输入到将基于 id 进行索引的搜索引擎中。其他各种 DBMS 都有 PIVOT 和 UNPIVOT 之类的东西。我将不胜感激对我所缺少的东西的任何见解。

马哈茂德

附言

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

谢谢!

4

2 回答 2

1

我从书The Art of SQL中得到了这个,第 284-286 页:

假设您的表名是foo.

首先,创建一个名为pivot

CREATE Table pivot (
  count int
);

插入到该表中的行数与您要转入的列数一样多foo。由于您foo要透视其中的三列,因此在透视表中创建三行:

insert into pivot values (1);
insert into pivot values (2);
insert into pivot values (3);

foo现在在and之间进行笛卡尔连接pivot,使用 aCASE根据计数选择正确的列:

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;

这应该给你你想要的。

于 2009-12-05T10:49:39.727 回答
0

经过一些相当广泛的挖掘后,我偶然发现了这个页面,它可能包含也可能不包含您的答案。这在 MySQL 中是一个难题,但从概念的角度来看,我可以构造一个查询,使用 describe 像这样进行转置(尽管它可能会执行得很糟糕)。所以我确信我们可以找到一种正确的方法。

于 2009-12-05T10:32:26.837 回答