sql >> Database >  >> RDS >> Mysql

MySQL selecteer gescheiden gegevens

Zoals geïmpliceerd door de opmerking van Strawberry hierboven, is er een manier om dit te doen, maar het is zo lelijk. Het is alsof je je dure keukenrenovatie afwerkt met ducttape. Je zou wrok moeten voelen jegens de persoon die de database op deze manier heeft ontworpen.

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;

Uitvoer, getest op MySQL 5.6:

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

De complexiteit van deze query, en het feit dat deze wordt gedwongen om een ​​tabelscan uit te voeren en niet kan worden geoptimaliseerd, zou u moeten overtuigen van wat is er mis met het opslaan van een lijst met id's in een gescheiden string .

De betere oplossing is om een ​​derde tabel te maken, waarin u elk individueel lid van de groep afzonderlijk op een rij opslaat. Dat wil zeggen, meerdere rijen per groep.

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

Dan kunt u op een eenvoudigere manier query's uitvoeren en heeft u de mogelijkheid om indexen te maken om de query zeer snel te maken.

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


  1. Een lijst met triggergebeurtenissen retourneren in SQL Server

  2. Alle waarden ='s' in tabel in PHP-fout

  3. Een bestand schrijven met meerdere threads

  4. Het ampersand-teken in de SQL-tekenreeks laten ontsnappen