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

MySQL vælger separerede data

Som antydet af Strawberrys kommentar ovenfor, er der en måde at gøre dette på, men det er så grimt. Det er som at afslutte dit dyre køkkenombygning med gaffatape. Du burde føle vrede over for den person, der har designet databasen på denne måde.

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, testet på MySQL 5.6:

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

Kompleksiteten af ​​denne forespørgsel og det faktum, at den vil blive tvunget til at foretage en tabelscanning og ikke kan optimeres, burde overbevise dig om hvad er der galt med at gemme en liste over id'er i en separeret streng .

Den bedre løsning er at oprette en tredje tabel, hvor du gemmer hvert enkelt medlem af gruppen på en række for sig selv. Det vil sige flere rækker pr. gruppe.

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

Så kan du forespørge på en enklere måde, og du har mulighed for at oprette indekser for at gøre forespørgslen meget hurtig.

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


  1. Om nytten af ​​udtryksindekser

  2. node.js async/await bruger med MySQL

  3. Få optegnelser fra sidste måned i SQL server

  4. Slet alle rækker med tidsstempel ældre end x dage