sql >> Base de Datos >  >> RDS >> Mysql

MySQL selecciona datos delimitados

Como implica el comentario anterior de Strawberry, hay una manera de hacer esto, pero es muy feo. Es como terminar la costosa remodelación de su cocina con cinta adhesiva. Debería sentir resentimiento hacia la persona que diseñó la base de datos de esta manera.

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;

Salida, probada en MySQL 5.6:

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

La complejidad de esta consulta y el hecho de que se verá obligada a realizar un escaneo de tabla y no se puede optimizar, debería convencerlo de ¿Qué hay de malo en almacenar una lista de ID en una cadena delimitada? .

La mejor solución es crear una tercera tabla, en la que almacene cada miembro individual del grupo en una fila por sí mismo. Es decir, varias filas por grupo.

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

Entonces puede consultar de una manera más simple y tiene la oportunidad de crear índices para que la consulta sea muy rápida.

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