Maison >base de données >tutoriel mysql >Comment inverser le GROUP_CONCAT de MySQL : diviser une chaîne concaténée en valeurs individuelles ?
Démêler l'énigme de l'inverse de GROUP_CONCAT dans MySQL
Dans le domaine de la manipulation de données, la fonction GROUP_CONCAT règne en maître dans la concaténation de plusieurs valeurs en un une seule chaîne. Cependant, l'opération inverse, diviser une chaîne concaténée en valeurs individuelles, pose un défi.
Le problème à résoudre
Considérez un scénario dans lequel vous avez une table "couleurs " avec des données structurées comme :
+----+----------------------+ | id | colors | +----+----------------------+ | 1 | Red,Green,Blue | | 2 | Orangered,Periwinkle | +----+----------------------+
Votre objectif est de transformer ces données en un contenu plus granulaire format :
+----+------------+ | id | colors | +----+------------+ | 1 | Red | | 1 | Green | | 1 | Blue | | 2 | Orangered | | 2 | Periwinkle | +----+------------+
La solution : plonger dans les profondeurs de SQL
Pour réaliser cette métamorphose des données, vous pouvez exploiter la puissance de la fonction SUBSTRING_INDEX. Cette fonction polyvalente vous permet d'extraire des sous-chaînes spécifiques en fonction de délimiteurs.
SELECT id, SUBSTRING_INDEX(SUBSTRING_INDEX(colors, ',', n.digit+1), ',', -1) color FROM colors INNER JOIN (SELECT 0 digit UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3) n ON LENGTH(REPLACE(colors, ',' , '')) <= LENGTH(colors)-n.digit ORDER BY id, n.digit
Dévoilement des mécanismes derrière la requête
La requête externe sélectionne la colonne "id" et utilise la fonction SUBSTRING_INDEX imbriquée deux fois pour isoler les sous-chaînes souhaitées. La première invocation de SUBSTRING_INDEX extrait la sous-chaîne jusqu'à la (n.digit 1)-ième virgule, tandis que la deuxième invocation extrait ensuite la sous-chaîne après la (n.digit 1)-ième virgule jusqu'à la fin de la chaîne.
Le INNER JOIN avec la sous-requête garantit que la fonction SUBSTRING_INDEX est appliquée pour un maximum de 4 sous-chaînes, telles que définies par la colonne "chiffre" dans la sous-requête. Pour prendre en charge davantage de sous-chaînes, ajustez la sous-requête en conséquence.
Enfin, la clause ORDER BY trie les résultats par « id », puis par séquence numérique de sous-chaînes pour chaque ligne.
Démo et crédits
Pour une démonstration pratique, visitez le violon lié dans la référence fourni.
Références
[Extraire plusieurs valeurs d'une liste séparée par des virgules](https://www.data-generator.com/fiddle/d3c78f201137b4b56a63a95332b8106b)
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!