MySQL-Pivot-Tabellenabfrage: Verwendung dynamischer Spalten für die Datenanalyse
P粉101708623
2023-08-22 11:54:19
<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 beiden 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 funktioniert gut :) </p>
<p>Da ich die „zusätzliche“ Tabelle dynamisch fülle, wäre es schön, wenn die Abfrage auch dynamisch wäre. Auf diese Weise muss ich die Abfrage nicht jedes Mal ändern, wenn ich einen neuen Feldnamen und Feldwert eingebe. </p>
我有一种稍微不同的方法来完成这个任务,与接受的答案不同。这种方法可以避免使用默认情况下有1024个字符限制的GROUP_CONCAT,并且如果你有很多字段,它将无法工作,除非你改变限制。
点击此处查看演示
在MySQL中,唯一动态执行此操作的方法是使用预处理语句。以下是一篇关于它们的好文章:
动态透视表(将行转换为列)
你的代码将如下所示:
查看演示
注意:GROUP_CONCAT函数的字符限制为1024个字符。请参阅参数group_concat_max_len