Você precisa especificar um
DISTINCT
, ou seja select users.name, group_concat( DISTINCT programs.name)
Veja a documentação do MySQL aqui .
Tente alterar sua consulta para:
SELECT users.name, group_concat(programs.name)
from users
LEFT JOIN linker on linker.user_id = users.id
LEFT JOIN programs on linker.program_id = programs.id
GROUP BY users.id
Isso lhe dará um
null
para qualquer usuário sem programas associados a eles. Para filtrá-los, basta adicionar um WHERE programs.id IS NOT NULL
.