Requête de table pivotante MySQL avec colonnes dynamiques
Je suis en utilisant les tableaux suivants pour le stockage de données sur le produit:
mysql> SELECT * FROM product;
+---------------+---------------+--------+
| id | name | description | stock |
+---------------+---------------+--------+
| 1 | product1 | first product | 5 |
| 2 | product2 | second product| 5 |
+---------------+---------------+--------+
mysql> SELECT * FROM product_additional;
+-----------------+------------+
| id | fieldname | fieldvalue |
+-----------------+------------+
| 1 | size | S |
| 1 | height | 103 |
| 2 | size | L |
| 2 | height | 13 |
| 2 | color | black |
+-----------------+------------+
À l'aide de la requête suivante pour sélectionner les enregistrements de deux tables
mysql> SELECT
p.id
, p.name
, p.description
,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)) as `color`
FROM product p
LEFT JOIN product_additional AS pa ON p.id = pa.id
GROUP BY p.id
+---------------+---------------+--------+---------+--------+
| id | name | description | size | height | color |
+---------------+---------------+--------+---------+--------+
| 1 | product1 | first product | S | 103 | null |
| 2 | product2 | second product| L | 13 | black |
+---------------+---------------+--------+---------+--------+
Et tout fonctionne correctement 🙂
Parce que je remplis le "supplémentaires" tableau dynamiquement ce serait bien, si la requête aussi dynamique. De cette façon, je n'ai plus à modifier la requête à chaque fois que je l'ai mis dans un nouveau nom de champ et fieldvalue.
source d'informationauteur fr0sty
Vous devez vous connecter pour publier un commentaire.
La seule façon de MySQL pour le faire dynamiquement est avec des requêtes Préparées. Voici un bon article à leur sujet:
Dynamique des tableaux croisés dynamiques (transformer des lignes et des colonnes)
Votre code devrait ressembler à ceci:
Voir SQL jouer avec la Démo
REMARQUE: la fonction GROUP_CONCAT a une limite de 1 024 caractères. Voir le paramètre group_concat_max_len
J'ai une façon légèrement différente de faire ce que l'on a accepté la réponse. De cette façon, vous pouvez éviter d'utiliser GROUP_CONCAT qui a une limite de 1024 caractères, et ne fonctionnera pas si vous avez beaucoup de domaines.
Voici la procédure stockée, ce qui va générer de la table basée sur les données d'une table et de colonne et des données d'autres tables et de colonnes.
La fonction "sum(if(col = valeur, 1,0)) comme valeur" est utilisé. Vous pouvez choisir parmi les différentes fonctions comme MAX(si()) etc.