MySQL ピボット テーブル クエリ: データ分析に動的列を使用する
P粉101708623
2023-08-22 11:54:19
<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>次のクエリを使用して両方のテーブルからレコードを選択します: </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>
これを実現する方法は、受け入れられた回答とは少し異なります。このアプローチでは、デフォルトで 1024 文字の制限がある GROUP_CONCAT の使用を回避します。制限を変更しない限り、フィールドが多い場合には機能しません。
リーリーデモを表示するにはここをクリックしてください
MySQL では、これを動的に行う唯一の方法は、準備されたステートメントを使用することです。これらについての良い記事は次のとおりです:
動的ピボット テーブル (行を列に変換)
コードは次のようになります:
リーリー表示デモ
注: GROUP_CONCAT 関数の文字制限は 1024 文字です。パラメータ group_concat_max_len
を参照してください。