Dynamische Spalten-MySQL-PivotTable-Abfrage
P粉262113569
2023-08-27 17:24:10
<p>Ich verwende die folgende Tabelle zum Speichern von Produktdaten: </p>
<pre class="brush:php;toolbar:false;">mysql>
+---------------+---------------+--------+
|. id |. Beschreibung |
+---------------+---------------+--------+
|. 1 |. erstes Produkt |
|. 2 |. zweites Produkt|
+---------------+---------------+--------+
mysql> SELECT * FROM product_additional;
+-----------------+----------------+
|. id |. Feldname |
+-----------------+----------------+
|. 1 |. Größe |
|. 1 |. Höhe |
|. 2 |. Größe |
|. 2 |. Höhe |
|. 2 |. Farbe |
+-----------------+----------------+</pre>
<p>Verwenden Sie die folgende Abfrage, um Datensätze aus zwei Tabellen auszuwählen</p>
<pre class="brush:php;toolbar:false;">mysql>
p.id
,p.name
, S. Beschreibung
,MAX(IF(pa.fieldname = 'size', pa.fieldvalue, NULL)) als `size`
,MAX(IF(pa.fieldname = 'height', pa.fieldvalue, NULL)) als `height`
,MAX(IF(pa.fieldname = 'color', pa.fieldvalue, NULL)) als `color`
AB Produkt S
LEFT JOIN product_additional AS pa ON p.id = pa.id
GRUPPE NACH p.id
+---------------+---------------+--------+-------- -+--------+
|. id |. Beschreibung |
+---------------+---------------+--------+-------- -+--------+
|. 1 |. erstes Produkt |
|. 2 |. zweites Produkt|
+---------------+---------------+--------+-------- -+--------+</pre>
<p>Alles ist gut :) </p>
<p>Da ich die „Append“-Tabelle dynamisch fülle, wäre es toll, wenn die Abfrage ebenfalls dynamisch wäre. Auf diese Weise muss ich die Abfrage nicht jedes Mal ändern, wenn ich einen neuen Feldnamen und Feldwert eingebe. </p>
我的做法与接受的答案略有不同。这样您就可以避免使用 GROUP_CONCAT,它默认限制为 1024 个字符,如果您有很多字段,则该限制将不起作用,除非您更改限制。
点击此处查看演示
MySQL 中动态执行此操作的唯一方法是使用准备好的语句。这是一篇关于它们的好文章:
动态数据透视表(将行转换为列)
您的代码将如下所示:
参见演示
注意:GROUP_CONCAT 函数的长度限制为 1024 个字符。查看参数group_concat_max_len