Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Dados delimitados de seleção do MySQL


Conforme implícito no comentário de Strawberry acima, existe uma maneira de fazer isso, mas é tão feio. É como terminar sua cara remodelação da cozinha usando fita adesiva. Você deve sentir ressentimento em relação à pessoa que projetou o banco de dados dessa maneira.
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;

Saída, testada no MySQL 5.6:
+----------+---------------+
| id_group | Names         |
+----------+---------------+
|        1 | Joe Mary Bill |
|        2 | Fred Mary     |
|        3 | Jack Joe      |
+----------+---------------+

A complexidade dessa consulta e o fato de que ela será forçada a fazer uma varredura de tabela e não pode ser otimizada deve convencê-lo de o que há de errado em armazenar uma lista de IDs em uma string delimitada .

A melhor solução é criar uma terceira tabela, na qual você armazena cada membro individual do grupo em uma linha isolada. Ou seja, várias linhas por grupo.
CREATE TABLE group_name (
  id_group INT NOT NULL,
  id_name INT NOT NULL,
  PRIMARY KEY (id_group, id_name)
);

Então você pode consultar de uma maneira mais simples e tem a oportunidade de criar índices para tornar a consulta muito rápida.
SELECT id_group, GROUP_CONCAT(names SEPARATOR ' ') AS names
FROM groups
JOIN group_name USING (id_group)
JOIN names USING (id_name)