将行转置到列

时间:2014-03-27 12:10:10

标签: php mysql

我试图以一种我从未做过的方式从两个表中得出一个结果集,而且我在查找如何做到这一点甚至在这些论坛中搜索的内容时遇到了一些麻烦。请考虑以下假设表数据:

Table1
----------------------------------
ID  |  Name
----------------------------------
1   |  aa
2   |  bb
3   |  cc
4   |  dd
5   |  ee


Table2
----------------------------------
ID  |  Table1_ID  |  Value
----------------------------------
1   |  1          |  good
2   |  2          |  Dumb
3   |  3          |  Fat
4   |  4          |  Wet
5   |  5          |  High
6   |  1          |  Thin
7   |  2          |  Tall
8   |  3          |  Goofy
9   |  4          |  Rich
10  |  5          |  Funny

我正在寻找一个允许我最终获得以下结果集的查询或方法: 代码:

aa      |    bb     |    cc       |    dd      |    ee
---------------------------------------------------------------
good     |    Dumb   |    Fat     |    Wet     |    High
Thin     |    Tall   |    Goofy   |    Rich    |    Funny

基本上,我希望能够获取Table1中的名称列表,将它们转换为列标题,然后将所有Table2的值放入各自的列中,并能够对任何列进行排序。这可能吗?

2 个答案:

答案 0 :(得分:0)

当然这可以在SQL中完成。但这很棘手。当数据写在问题中时,您可以按t2.id分组.5之后,查询只是条件聚合。

select max(case when t2.table1_Id = 1 then value end) as aa,
       max(case when t2.table1_Id = 2 then value end) as bb,
       max(case when t2.table1_Id = 3 then value end) as cc,
       max(case when t2.table1_Id = 4 then value end) as dd,
       max(case when t2.table1_Id = 5 then value end) as ee
from table2 t2 
group by cast(t2.id - 1 / 5 as int);

将值与id隐式相关似乎是一个非常非常糟糕的数据库设计。应该有某种组合它们的实体ID。

答案 1 :(得分:0)

你在这里遇到两个问题: 1)使用值作为列名称不能以干净的方式完成 2)你想将table2.value分成2行:哪一行应该在哪一行? Gordon Linoff为此使用了table2.id字段,但是如果它自动递增并且你的数据在稍后的节奏上会有一些添加/删除会被破坏。

之前有过类似的问题。这个答案非常接近:

mysql select dynamic row values as column names, another column as value

在这里,他们为查询生成字符串,并从中生成一个准备好的语句。