Mysql
 sql >> Database >  >> RDS >> Mysql

MySQL seleziona dati delimitati

Come suggerisce il commento di Strawberry sopra, c'è un modo per farlo, ma è così brutto. È come finire la tua costosa ristrutturazione della cucina usando del nastro adesivo. Dovresti provare risentimento verso la persona che ha progettato il database in questo modo.

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;

Output, testato su MySQL 5.6:

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

La complessità di questa query e il fatto che sarà forzata a eseguire una scansione della tabella e non può essere ottimizzata dovrebbero convincerti di cosa c'è di sbagliato nella memorizzazione di un elenco di ID in una stringa delimitata .

La soluzione migliore è creare una terza tabella, in cui memorizzi ogni singolo membro del gruppo su una riga da solo. Ovvero, più righe per gruppo.

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

Quindi puoi eseguire query in un modo più semplice e hai l'opportunità di creare indici per rendere la query molto veloce.

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