Maison >base de données >tutoriel mysql >Comment joindre efficacement des tables avec des valeurs séparées par des virgules ?
Joindre des tables avec des colonnes séparées par des virgules
Lors de la jointure de tables dont une colonne contient des valeurs séparées par des virgules, trouver des enregistrements correspondants peut être difficile. Pour résoudre ce problème, une approche viable consiste à utiliser la fonction find_in_set.
Exemple de requête avec find_in_set
Supposons que nous ayons le schéma suivant :
CREATE TABLE tblC ( id INT NOT NULL AUTO_INCREMENT, nname VARCHAR(255), userids VARCHAR(255), PRIMARY KEY (id) ); CREATE TABLE tblB ( id INT NOT NULL AUTO_INCREMENT, username VARCHAR(255), userid INT, PRIMARY KEY (id) ); INSERT INTO tblC (nname, userids) VALUES ('new1', '1,2'), ('new2', '1,3'), ('new3', '1,4'), ('new4', '3,2'), ('new5', '5,2'); INSERT INTO tblB (username, userid) VALUES ('A', 1), ('B', 2), ('C', 3), ('D', 4), ('E', 5);
Pour trouver tous les noms d'utilisateur lors de la recherche de "new1", nous pouvons utiliser ce qui suit requête :
SELECT * FROM tblC AS c JOIN tblB AS b ON (find_in_set(b.userid, c.userids) > 0) WHERE c.nname = 'new1';
Considérations sur la normalisation
Cependant, il est important de noter que le stockage de valeurs séparées par des virgules dans une seule colonne est considéré comme une violation des principes de normalisation de la base de données. Une meilleure approche serait d'avoir une table de jonction distincte pour contenir les associations d'utilisateurs pour chaque ligne dans tblC. Cela éliminerait le besoin de find_in_set et permettrait des requêtes plus efficaces.
Exemple de schéma normalisé
CREATE TABLE tblC ( id INT NOT NULL AUTO_INCREMENT, nname VARCHAR(255), PRIMARY KEY (id) ); CREATE TABLE tblC_user ( c_id INT, userid INT, PRIMARY KEY (c_id, userid) ); INSERT INTO tblC (nname) VALUES ('new1'), ('new2'), ('new3'), ('new4'), ('new5'); INSERT INTO tblC_user (c_id, userid) VALUES (1, 1), (1, 2), (2, 1), (2, 3), (3, 1), (3, 4), (4, 3), (4, 2), (5, 5), (5, 2);
Requête avec schéma normalisé
SELECT * FROM tblC AS c JOIN tblC_user AS cu ON (c.id = cu.c_id) JOIN tblB AS b ON (b.userid = cu.userid) WHERE c.nname = 'new1';
En utilisant un schéma normalisé, nous optimisons les performances des requêtes et garantissons l'intégrité des données en éliminant les doublons. ou des relations incohérentes.
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!