Maison >base de données >tutoriel mysql >Comment joindre efficacement des tables avec des valeurs séparées par des virgules ?

Comment joindre efficacement des tables avec des valeurs séparées par des virgules ?

Patricia Arquette
Patricia Arquetteoriginal
2024-12-24 05:45:09997parcourir

How to Efficiently Join Tables with Comma-Separated Values?

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!

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