2012-10-30 94 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