我正在寻找一个查询,它会将几行返回到列中,但事先不知道行数。我搜索过,我发现的唯一解决方案涉及知道有多少行。
这是一个示例表:
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 :(得分:1)
如果不知道列数,则无法在SQL中执行查询。
在解析查询时,必须修复SELECT列表的列。您要求的是,在查询执行之前未知的数据状态决定了列数。这不是SQL的工作方式。
要完成数据透视类型操作或数据确定列的任何查询,您有两种选择:
执行预备查询以发现要获取的不同组的数量,并使用此查询来构建具有匹配列数的查询。
查询行中的所有数据,将其提取回应用程序,然后将结果集完全转换为代码中的数据结构(即数组)。
无论哪种方式,您都需要在获取数据之前或之后编写应用程序代码。
重新评论:你是对的,这不是传统的支点,但它的相似之处在于数据正在推动列数。也就是说,您需要的列数是最大组中行数的2倍。但它们不会全部被填充,因为每组的行数会有所不同。每组没有固定数量的行,因此无法为每个组填充固定数量的列。
我真的建议您使用后一种策略:将数据作为行提取,因为它们存储在数据库中。然后在您的应用程序代码中对其进行后处理。循环遍历结果集,并在从数据库中获取行时逐步构建数据结构。
例如,在PHP中:
while ($row = $stmt->fetch()) {
$data[$row['parentID']][] = $row['colA'];
$data[$row['parentID']][] = $row['colB'];
}