Jak sugeruje komentarz Strawberry powyżej, jest na to sposób, ale jest to takie brzydkie. To jak wykończenie drogiej przebudowy kuchni za pomocą taśmy klejącej. Powinieneś czuć urazę do osoby, która w ten sposób zaprojektowała bazę danych.
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;
Wyjście, przetestowane na MySQL 5.6:
+----------+---------------+
| id_group | Names |
+----------+---------------+
| 1 | Joe Mary Bill |
| 2 | Fred Mary |
| 3 | Jack Joe |
+----------+---------------+
Złożoność tego zapytania oraz fakt, że będzie ono zmuszone do skanowania tabeli i nie może zostać zoptymalizowane, powinny przekonać Cię do co jest nie tak z przechowywaniem listy identyfikatorów w rozdzielanym ciągu .
Lepszym rozwiązaniem jest utworzenie trzeciej tabeli, w której każdy członek grupy będzie przechowywany osobno w rzędzie. Oznacza to wiele wierszy na grupę.
CREATE TABLE group_name (
id_group INT NOT NULL,
id_name INT NOT NULL,
PRIMARY KEY (id_group, id_name)
);
Następnie możesz wykonywać zapytania w prostszy sposób i masz możliwość tworzenia indeksów, które przyspieszają wykonywanie zapytań.
SELECT id_group, GROUP_CONCAT(names SEPARATOR ' ') AS names
FROM groups
JOIN group_name USING (id_group)
JOIN names USING (id_name)