Joindre des tables avec des valeurs séparées par des virgules dans une seule colonne
Lorsque vous travaillez avec des bases de données, il est souvent nécessaire de joindre des tables basées sur des colonnes contenant des virgules -valeurs séparées. Dans ce cas précis, vous essayez de récupérer des noms d'utilisateur pour lesquels une colonne séparée par des virgules dans le tableau C (« ID utilisateur ») correspond à un terme de recherche spécifique.
Requête SQL utilisant l'extraction de sous-chaînes
Votre requête initiale a tenté d'utiliser une sous-requête pour extraire la première valeur de la chaîne séparée par des virgules dans la colonne « ID utilisateur » du tableau C. Cependant, cette approche est inefficace et peu fiable car elle suppose que la valeur souhaitée est toujours la première de la chaîne.
Requête améliorée à l'aide de find_in_set
Une meilleure solution consiste à utiliser La fonction find_in_set de MySQL, qui vous permet de rechercher une valeur spécifique dans un espace séparé par des virgules. string :
SELECT * FROM tblC c JOIN tblB b ON (find_in_set(b.userid, c.userids) > 0) WHERE c.nname = "new1"
Cette requête récupérera efficacement tous les noms d'utilisateur associés aux lignes du tableau C où la colonne "nname" correspond à "new1".
Alternative au schéma normalisé
Cependant, il est important de noter que stocker des valeurs séparées par des virgules dans une colonne n'est pas une pratique recommandée. Pour une meilleure intégrité des données et de meilleures performances, il est préférable de normaliser le schéma en introduisant une table de jonction.
Dans l'exemple fourni, vous pouvez créer une nouvelle table de jonction (tblC_user) avec deux colonnes : c_id (clé étrangère de la table C) et l'ID utilisateur (clé étrangère de la table B). Cela vous permettra de représenter la relation plusieurs-à-plusieurs entre les tables C et B sans avoir besoin de chaînes séparées par des virgules.
Requête normalisée
Utilisation de la relation normalisée schéma, vous pouvez utiliser la requête suivante pour récupérer les résultats souhaités :
SELECT * FROM tblC c JOIN tblC_user cu ON (c.id = cu.c_id) JOIN tblB b ON (b.userid = cu.userid) WHERE c.nname = "new1"
Cette requête fournira un et fiable pour joindre des tables basées sur des valeurs séparées par des virgules.
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!