Mysql
 sql >> Base de données >  >> RDS >> Mysql

MySQL sélectionne des données délimitées

Comme le laisse entendre le commentaire de Strawberry ci-dessus, il existe un moyen de le faire, mais c'est tellement moche. C'est comme terminer la rénovation de votre cuisine coûteuse avec du ruban adhésif. Vous devriez ressentir du ressentiment envers la personne qui a conçu la base de données de cette façon.

SELECT g.id_group, GROUP_CONCAT(n.Names SEPARATOR ' ') AS Names
FROM groups AS g JOIN names AS n
  ON FIND_IN_SET(n.id_names, REPLACE(g.Name, '|', ','))
GROUP BY g.id_group;

Résultat, testé sur MySQL 5.6 :

+----------+---------------+
| id_group | Names         |
+----------+---------------+
|        1 | Joe Mary Bill |
|        2 | Fred Mary     |
|        3 | Jack Joe      |
+----------+---------------+

La complexité de cette requête, et le fait qu'elle sera obligée de faire un table-scan et ne pourra pas être optimisée, devrait vous convaincre de ce qui ne va pas avec le stockage d'une liste d'identifiants dans une chaîne délimitée .

La meilleure solution consiste à créer une troisième table, dans laquelle vous stockez chaque membre individuel du groupe sur une ligne à part. Autrement dit, plusieurs lignes par groupe.

CREATE TABLE group_name (
  id_group INT NOT NULL,
  id_name INT NOT NULL,
  PRIMARY KEY (id_group, id_name)
);

Ensuite, vous pouvez interroger de manière plus simple et vous avez la possibilité de créer des index pour rendre la requête très rapide.

SELECT id_group, GROUP_CONCAT(names SEPARATOR ' ') AS names
FROM groups
JOIN group_name USING (id_group)
JOIN names USING (id_name)