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 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 :
Informations supplémentaires :
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!