動的列MySQLピボットテーブルクエリ
P粉262113569
2023-08-27 17:24:10
<p>次のテーブルを使用して商品データを保存します。</p>
<pre class="brush:php;toolbar:false;">mysql> SELECT * FROM product;
--------------- --------------- ------
| ID | 名前 | 説明 | ストック |
--------------- --------------- ------
| 1 | 製品 1 | 最初の製品 | 5 |
| 2 | 製品 2 | 2 番目の製品 | 5 |
--------------- --------------- ------
mysql> SELECT * FROM product_Additional;
--------------------------------------
| ID | フィールド名 | フィールド値 |
--------------------------------------
| 1 | サイズ | S |
| 1 | 身長 | 103 |
| 2 | サイズ | L |
| 2 | 高さ | 13 |
| 2 | カラー | ブラック |
------------------ ------------ </pre>
<p>次のクエリを使用して 2 つのテーブルからレコードを選択します</p>
<pre class="brush:php;toolbar:false;">mysql> SELECT
p.id
,p.name
、p.説明
,MAX(IF(pa.fieldname = 'size', pa.fieldvalue, NULL)) as `size`
,MAX(IF(pa.fieldname = 'height', pa.fieldvalue, NULL)) as `height`
,MAX(IF(pa.fieldname = 'color', pa.fieldvalue, NULL)) `color` として
製品pから
LEFT JOIN product_Additional AS pa ON p.id = pa.id
p.id によるグループ化
--------------- --------------- -------- ---------- -- ------
| ID | 名前 | 説明 | サイズ | 高さ | 色 |
--------------- --------------- -------- ---------- -- ------
| 1 | 製品 1 | 最初の製品 | S | 103 | null |
| 2 | product2 | 2 番目の製品 | L | 13 | ブラック |
--------------- --------------- -------- ---------- -- - ----- </pre>
<p>すべて問題ありません:) </p>
<p>「追加」テーブルに動的にデータを入力しているので、クエリも動的であれば素晴らしいでしょう。こうすることで、新しいフィールド名とフィールド値を入力するたびにクエリを変更する必要がなくなります。 </p>
私のアプローチは、受け入れられた答えとは少し異なります。こうすることで、GROUP_CONCAT の使用を回避できます。GROUP_CONCAT のデフォルト制限は 1024 文字で、フィールドが多い場合は制限を変更しない限り機能しません。
リーリーデモを表示するにはここをクリックしてください
MySQL でこれを動的に行う唯一の方法は、準備されたステートメントを使用することです。これらについての良い記事は次のとおりです:
動的ピボットテーブル (行を列に変換)
コードは次のようになります:
リーリー参照デモ
注: GROUP_CONCAT 関数の長さは 1024 文字に制限されています。ビューパラメータ group_concat_max_len