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