MySQL将多个(变量)行组合成一行,具有多个列

时间:2012-10-30 20:29:13

标签: 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导出器插件。

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

1 个答案:

答案 0 :(得分:1)

如果不知道列数,则无法在SQL中执行查询。

在解析查询时,必须修复SELECT列表的列。您要求的是,在查询执行之前未知的数据状态决定了列数。这不是SQL的工作方式。

要完成数据透视类型操作或数据确定列的任何查询,您有两种选择:

  • 执行预备查询以发现要获取的不同组的数量,并使用此查询来构建具有匹配列数的查询。

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

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


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

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

例如,在PHP中:

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