Maison >base de données >tutoriel mysql >Comment inverser le GROUP_CONCAT de MySQL : diviser une chaîne concaténée en valeurs individuelles ?

Comment inverser le GROUP_CONCAT de MySQL : diviser une chaîne concaténée en valeurs individuelles ?

Barbara Streisand
Barbara Streisandoriginal
2024-12-16 22:05:14524parcourir

How to Reverse MySQL's GROUP_CONCAT: Splitting a Concatenated String into Individual Values?

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn