2012-10-30 60 views
0

我正在查找一个查询,它会将几行返回到列中,但事先不知道行数。我搜索了,我发现的唯一解决方案涉及知道有多少行。MySQL组将多个(可变)行组合成一行,并且有多列

下面是一个例子表:

parentID colA  colB 
2   aaaaaa  1000.00 
2   bbbbbb  1500.00 
3   cccccc  500.00 
3   dddddd  700.00 
3   eeeeee  2000.00 

,我需要它看起来像:

parentID colA(n)  colB(n)  colA(n+1)  colB(n+1)  colA(n+2)  colB(n+2) 
2   aaaaaaa  1000.00  bbbbbb  1500.00  NULL   NULL 
3   cccccc  500.00  dddddd  700.00  eeeeee  2000.00 

我知道这应该在PHP做,但我需要它是在MySQL第三派对excel出口商插件我正在使用。

编辑:有没有办法做到这一点,如果我知道我需要的最大列数?

+0

必须使用动态SQL来完成,无论是在PHP,或与构建和动态执行SQL语句MySQL的存储过程。单个直接的SQL语句无法实现它。 –

+0

因为这是不可能的列(以及使用作为@迈克尔Berkowski提出将引进可能的竞争条件下的动态SQL)我害怕的是 – zerkms

+0

的动态数...然后我就既考虑动态SQL或找到新的解决方案,以出口脱颖而出。谢谢。 – Falantar014

回答

1

在不知道列数的情况下,您无法在SQL中执行查询。

在解析查询时,SELECT列表的列必须是固定的。你所要求的是数据的状态直到执行查询时才知道,它决定了列的数量。这不是SQL的工作方式。

为了实现枢轴式操作,或在数据决定了列有任何疑问,你有两个选择:

  • 做一个准备的查询来发现你要多少不同的群体获取和用它来构建具有匹配列数的查询。

  • 查询行中的所有数据,将其取回到您的应用程序中,然后将结果集全部转换为代码内的数据结构(即数组)。

无论哪种方式,您都需要在提取数据之前或之后编写应用程序代码。


重新评论:您说的没错,这不是传统的支点,但它与数据驱动的列数相似。也就是说,您需要的列数为最大组中行数的2倍。但是它们不会全部被填满,因为每组的行数不同。每个组没有固定数量的行,因此无法为每个组填充固定数量的列。

我真的建议您使用一种策略:取数据为行,因为它们是存储在数据库中。然后在应用程序代码中对其进行后处理。循环访问结果集,并在您从数据库中获取行时逐步构建数据结构。

例如,在PHP:

while ($row = $stmt->fetch()) { 
    $data[$row['parentID']][] = $row['colA']; 
    $data[$row['parentID']][] = $row['colB']; 
} 
+0

好吧,例如,我可以找出我需要多少行,并将其存储在变量numRows中,那么我将如何'旋转'数据?这不是一个传统的数据透视表,其中有一列有一些可以排列成列的一致数据。 – Falantar014