Maison  >  Article  >  base de données  >  Puis-je joindre des tables dans MySQL en fonction de valeurs séparées par des points-virgules ?

Puis-je joindre des tables dans MySQL en fonction de valeurs séparées par des points-virgules ?

Barbara Streisand
Barbara Streisandoriginal
2024-11-01 00:03:28941parcourir

Can I Join Tables in MySQL Based on Values Separated by Semicolons?

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

Question :

J'ai des données dans plusieurs tables que je dois rejoindre en fonction de ';' (point-virgule) sépare les valeurs dans une colonne. Je ne peux pas utiliser PHP ou tout autre langage pour manipuler les résultats. Existe-t-il un moyen d'y parvenir en utilisant uniquement MySQL ?

Réponse :

Oui, il est possible de rejoindre sur ';' valeurs séparées dans une colonne en utilisant MySQL pur. Vous trouverez ci-dessous une explication détaillée de la solution :

Conversion de la chaîne délimitée en lignes

La clé est de convertir le ';' chaîne délimitée en une série de lignes. Ceci peut être réalisé en suivant les étapes suivantes :

  1. Créez un tableau nommé série entière contenant les nombres de 1 au nombre maximum d'éléments dans la chaîne délimitée.
  2. Utilisez COUNT_IN_SET et VALUE_IN_SET fonctions pour compter le nombre d'éléments dans la chaîne délimitée et extraire chaque élément en fonction de sa position.
  3. Rejoignez la table user_resource avec la table integerseries à l'aide d'une jointure croisée. Cela générera des lignes pour chaque élément de la chaîne délimitée.

Requête pour normaliser la table User_resource

<code class="sql">SELECT user_resource.user, 
       user_resource.resources,
       COUNT_IN_SET(user_resource.resources, ';') AS resources_count, 
       isequence.id AS resources_index,
       VALUE_IN_SET(user_resource.resources, ';', isequence.id) AS resources_value
FROM 
     user_resource 
     JOIN  integerseries AS isequence 
       ON  isequence.id <= COUNT_IN_SET(user_resource.resources, ';')
ORDER BY
       user_resource.user, isequence.id</code>

Rejoindre la table normalisée avec la table des ressources

Une fois la table user_resource normalisée, elle peut être jointe à la table des ressources pour obtenir le résultat souhaité.

<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>

Exemples d'entrée et de sortie

Tableau des ressources utilisateur :

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

Tableau des ressources :

id data
1 data1
2 data2
3 data3
4 data4
5 data5

Tableau des ressources_utilisateur normalisé :

user resources resources_count resources_index resources_value
user1 1;2;4 3 1 1
user1 1;2;4 3 2 2
user1 1;2;4 3 3 4
user2 2 1 1 2
user3 3;4 2 1 3
user3 3;4 2 2 4

Sortie (résultat joint) :

user data
user1 data1
user1 data2
user1 data4
user2 data2

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