0

いくつかの行を列に返すクエリを探していますが、事前に行数を知りません。私は検索しましたが、見つけた唯一の解決策は、行数を知ることです。

テーブルの例を次に示します。

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で行う必要があることを認識していますが、使用しているサードパーティのExcelエクスポータープラグインのためにmysqlで行う必要があります。

編集:必要な列の最大数がわかっている場合、これを行う方法はありますか?

4

1 に答える 1

1

列の数を知らずに SQL でクエリを実行することはできません。

SELECT リストの列は、クエリの解析時に固定する必要があります。あなたが求めているのは、クエリが実行されるまでわからないデータの状態が列の数を決定するということです。これは、SQL が機能する方法ではありません。

ピボット タイプの操作、またはデータによって列が決定される任意のクエリを実行するには、次の 2 つの選択肢があります。

  • 準備クエリを実行して、取得する個別のグループの数を確認し、これを使用して一致する数の列でクエリを作成します。

  • 行内のすべてのデータをクエリし、それをアプリケーションにフェッチしてから、コード内のデータ構造 (つまり配列) 内で結果セット全体を変換します。

いずれにせよ、データをフェッチする前または後に、アプリケーション コードを記述する必要があります。


あなたのコメントについて: そうです、これは従来のピボットではありませんが、データが列の数を駆動しているという点で似ています。つまり、最大グループの行数の 2 倍の列が必要です。ただし、グループごとの行数が異なるため、すべてが満たされるわけではありません。グループごとに固定数の行がないため、グループごとに固定数の列を埋めることはできません。

後者の戦略を使用することを強くお勧めします。データはデータベースに保存されるため、行としてフェッチします。次に、アプリケーション コードで後処理します。結果セットをループし、データベースから行をフェッチするときにデータ構造を段階的に構築します。

たとえば、PHP では次のようになります。

while ($row = $stmt->fetch()) {
  $data[$row['parentID']][] = $row['colA'];
  $data[$row['parentID']][] = $row['colB'];
}
于 2012-11-20T19:38:28.457 に答える