我有一个表,它类似于以下以下内容:

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

我希望能够编写一个查询,请不使用工会后,将返回我调换此表的列到行的结果集。这意味着,是我想得到的结果是:

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

这是可能在MySQL?我不能下降到应用层和执行这一点,因为我喂它们转变成能够将指数基于ID的搜索引擎。其他各种DBMS有类似PIVOT和UNPIVOT。我将不胜感激任何见解的东西,我错过了。

马哈茂德

P.S。

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

谢谢!

有帮助吗?

解决方案

我得到这个出书 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);

现在做的笛卡尔foopivot之间加入,使用CASE基于计数来选择正确的列:

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;

这应该给你你想要的东西。

scroll top