sql >> Databasteknik >  >> RDS >> Mysql

MySQL välj avgränsad data

Som antyds av Strawberrys kommentar ovan finns det ett sätt att göra detta, men det är så fult. Det är som att avsluta din dyra köksrenovering med tejp. Du bör känna förbittring mot personen som designade databasen på detta sätt.

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;

Utdata, testad på MySQL 5.6:

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

Den här frågans komplexitet, och det faktum att den kommer att tvingas göra en tabellsökning och inte kan optimeras, bör övertyga dig om vad är det för fel med att lagra en lista med id:n i en avgränsad sträng .

Den bättre lösningen är att skapa en tredje tabell, där du lagrar varje enskild medlem i gruppen på en rad för sig. Det vill säga flera rader per grupp.

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

Då kan du fråga på ett enklare sätt, och du har möjlighet att skapa index för att göra frågan väldigt snabb.

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


  1. Hur ansluter man från en pool av Google Compute Engine-instanser till Cloud SQL DB i samma projekt?

  2. Varför behöver jag OR NULL i MySQL när jag räknar rader med ett villkor

  3. AUTO_INCREMENT och LAST_INSERT_ID

  4. Hur infogar man data med automatiskt värde till createDate och updatedDate med Spring, Hibernate?