Maison  >  Article  >  base de données  >  Puis-je rejoindre des valeurs séparées \';\' dans une colonne MySQL sans utiliser de langages externes ?

Puis-je rejoindre des valeurs séparées \';\' dans une colonne MySQL sans utiliser de langages externes ?

Susan Sarandon
Susan Sarandonoriginal
2024-10-31 12:56:02725parcourir

Can I Join on ';' Separated Values in a MySQL Column Without Using External Languages?

Puis-je résoudre ce problème avec Pure MySQL ? (Rejoindre des valeurs séparées par ';' dans une colonne)

Cette question se pose lorsque vous avez des données réparties sur plusieurs tables et que vous devez les récupérer dans une seule requête sans utiliser de langages externes comme PHP. Les données sont stockées de manière dénormalisée, avec plusieurs valeurs dans une seule colonne séparées par des points-virgules (;).

Description du problème :

Dans ce cas, la ressource_utilisateur La table a une colonne de ressources qui contient une liste d'ID de ressources séparés par des points-virgules :

user resources
user1 1;2;4
user2 2
user3 3;4

Résultat souhaité :

Le résultat souhaité est d'obtenir une table qui répertorie chaque utilisateur et les ressources correspondantes :

user data
user1 data1
user1 data2
user1 data4
user2 data2

Solution :

La solution consiste à créer une table 'normalisée' à partir de la table user_resource, en traitant la liste des ID de ressources sous forme de lignes et en joignant la table normalisée avec la table des ressources. Cette « normalisation » est obtenue à l'aide d'une combinaison des fonctions COUNT_IN_SET et VALUE_IN_SET.

Tableau normalisé :

Le tableau « normalisé » généré ressemblera à ce qui suit :

user resources resources_index resources_value
sampleuser 1;2;3 1 1
sampleuser 1;2;3 2 2
sampleuser 1;2;3 3 3
stacky 2 1 2
testuser 1;3 1 1
testuser 1;3 2 3

Requête finale :

<code class="sql">SELECT user_resource.user, 
       resource.data

FROM user_resource 
     JOIN integerseries AS isequence 
       ON isequence.id <= COUNT_IN_SET(user_resource.resources, ';')
     JOIN resource 
       ON resource.id = VALUE_IN_SET(user_resource.resources, ';', isequence.id)      
ORDER BY
       user_resource.user,  resource.data</code>

Fonctions utilisées :

Les fonctions COUNT_IN_SET et VALUE_IN_SET sont utilisées comme suit :

  • COUNT_IN_SET : renvoie le nombre d'éléments délimités par des caractères dans une colonne donnée.
  • VALUE_IN_SET : traite la liste délimitée comme un tableau à base unique et renvoie la valeur à un « index » spécifique.

Informations supplémentaires :

  • La table de séries entières est une table qui contient les nombres de 1 à une limite spécifique, utilisés pour générer les lignes « normalisées ».
  • Cette solution fournit une approche générique pour gérer les éléments de liste délimités dans une colonne MySQL, pas seulement dans le contexte de l'exemple spécifique fourni .

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