Conforme implícito no comentário de Strawberry acima, existe uma maneira de fazer isso, mas é tão feio. É como terminar sua cara remodelação da cozinha usando fita adesiva. Você deve sentir ressentimento em relação à pessoa que projetou o banco de dados dessa maneira.
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;
Saída, testada no MySQL 5.6:
+----------+---------------+
| id_group | Names |
+----------+---------------+
| 1 | Joe Mary Bill |
| 2 | Fred Mary |
| 3 | Jack Joe |
+----------+---------------+
A complexidade dessa consulta e o fato de que ela será forçada a fazer uma varredura de tabela e não pode ser otimizada deve convencê-lo de o que há de errado em armazenar uma lista de IDs em uma string delimitada .
A melhor solução é criar uma terceira tabela, na qual você armazena cada membro individual do grupo em uma linha isolada. Ou seja, várias linhas por grupo.
CREATE TABLE group_name (
id_group INT NOT NULL,
id_name INT NOT NULL,
PRIMARY KEY (id_group, id_name)
);
Então você pode consultar de uma maneira mais simples e tem a oportunidade de criar índices para tornar a consulta muito rápida.
SELECT id_group, GROUP_CONCAT(names SEPARATOR ' ') AS names
FROM groups
JOIN group_name USING (id_group)
JOIN names USING (id_name)