MySQLで、別の列に基づいて複数の列をテーブルにバッチ追加します
P粉336536706
2023-08-28 11:03:44
<p>3 つの列があるテーブルがあります。
ID ごとに、最大 400 個の <code>index</code> 値があります。インデックスの数に基づいて列を追加したいと考えています。私が提供した例では、4 つのインデックスがあり、テーブルに 4 つの列を追加しました。これは私が持っているテーブルです: </p>
<pre class="brush:php;toolbar:false;">テーブル buy_sell を作成 (id int, idx varchar(255), sell float(2, 1));
buy_sell (id, idx, sell) の値 ('1', 'a', '4'); に挿入します。
buy_sell (id, idx, sell) の値 ('1', 'b', '6') に挿入します。
buy_sell (id, idx, sell) の値 ('1', 'c', '8'); に挿入します。
buy_sell (id, idx, sell) の値 ('1', 'd', '9') に挿入します。
buy_sell (id, idx, sell) 値 ('3', 'b', '1'); に挿入します。
buy_sell (id, idx, sell) 値 ('3', 'c', '2'); に挿入します。
buy_sell (id, idx, sell) の値 ('2', 'a', '5'); に挿入します。
buy_sell (id, idx, sell) の値 ('2', 'b', '7'); に挿入します。
buy_sell (id, idx, sell) の値 ('2', 'd', '5') に挿入します。
SELECT * FROM buy_sell;</pre>
<p>これが結果です: </p>
<テーブルクラス="s-テーブル">
<頭>
<tr>
id |
<th>idx</th>
<th>販売中</th>
</tr>
</頭>
<みんな>
<tr>
1 |
<td>a</td>
4.0 |
</tr>
<tr>
1 |
<td>b</td>
<td>6.0</td>
</tr>
<tr>
1 |
<td>c</td>
8.0 |
</tr>
<tr>
1 |
<td>d</td>
9.0 |
</tr>
<tr>
3 |
<td>b</td>
1.0 |
</tr>
<tr>
3 |
<td>c</td>
2.0 |
</tr>
<tr>
2 |
<td>a</td>
5.0 |
</tr>
<tr>
2 |
<td>b</td>
7.0 |
</tr>
<tr>
2 |
<td>d</td>
5.0 |
</tr>
</tbody>
</テーブル>
<p>たとえば、id=1 の場合、ここには 4 つのインデックス (a、b、c、d) があり、4 つの非ゼロ列があります。id = 3 の場合、2 つのインデックス (b、c) があり、次に 2 つの非ゼロ列があるため、最初の列には 0 を、2 番目の列には 1 を、3 番目の列には 2 を配置します。などなど。これが私が望むテーブルです: </p>
<テーブルクラス="s-テーブル">
<頭>
<tr>
id |
<th>1</th>を販売
<th>2</th>を販売します
<th>3<th<th>を販売します
<th>4<th<th>を販売
</tr>
</頭>
<みんな>
<tr>
1 |
<td>4</td>
<td>6</td>
<td>8</td>
9 |
</tr>
<tr>
3 |
0 |
1 |
2 |
0 |
</tr>
<tr>
2 |
5 |
<td>7</td>
0 |
5 |
</tr>
</tbody>
</テーブル>
<p>いろいろ検索して、<code>Group_concat</code>、<code>JSON_ARRAYAGG</code>などを試しましたが、解決策が見つかりませんでした。何をすればいいですか? </p>
SQL 言語には、データが表示される前に、クエリのコンパイル時に結果内の列の数を知るための非常に厳しい要件があります。必要な列の数を決定するためにデータを確認する必要がある場合は、(危険な可能性がある) 動的 SQL のみを使用できます。それには、次の 3 つの手順が必要です。
クエリを実行して、必要な列に関する情報を見つけます。-
ステップ 1 の結果を使用して、新しい SQL ステートメントを動的に構築します。 -
ステップ 2 の SQL を実行します。 -
この場合、必要な列の数は不明ですが、「最大 400 列」であることがわかります。これを念頭に置くと、次のようなコードが表示されるかもしれません:リーリー
はい、すべての可能な列に対してクエリで何かを指定する必要があります。これは、sell
このアプローチは、リレーショナル データベースの背後にある集合論の原則にも真っ向から反するものであるため、実際には、クライアント コードまたはレポート ツールにデータのピボット処理を行わせる方が良いでしょう。値がすべて 0 より大きいことも前提としています。値が正の数値と負の数値が混在している可能性がある場合は、
MAX()の代わりに
SUM()を使用してみてください。