Por causa do
ORDER BY id DESC
cláusula, a consulta é tratada como se tivesse sido escrita:SELECT DISTINCT name, id
FROM table
ORDER BY id DESC;
exceto que o
id
colunas não são retornadas ao usuário (você). O conjunto de resultados deve incluir o id
para poder encomendar por ele. Obviamente, esse conjunto de resultados tem quatro linhas, então é isso que é retornado. (Moral:não ordene por colunas ocultas - a menos que você saiba o que isso fará com sua consulta.) Tentar:
SELECT DISTINCT name
FROM table
ORDER BY name;
(com ou sem DESC de acordo com o capricho). Isso retornará apenas as duas linhas.
Se você precisa saber um
id
para cada nome, considere:SELECT name, MIN(id)
FROM table
GROUP BY name
ORDER BY MIN(id) DESC;
Você pode usar o MAX para um efeito igualmente bom.
Tudo isso se aplica a todos os bancos de dados SQL, incluindo MySQL. O MySQL tem algumas regras que permitem a você omitir cláusulas GROUP BY com resultados um tanto não determinísticos. Eu recomendo contra a exploração do recurso.
Por muito tempo (talvez até agora) o padrão SQL não permitia ordenar por colunas que não estavam na lista de seleção, justamente para evitar confusões como essa. Quando o conjunto de resultados não inclui os dados de ordenação, a ordenação do conjunto de resultados é chamada de 'ordenação essencial'; se todas as colunas de ordenação aparecerem no conjunto de resultados, é uma 'ordenação não essencial' porque você tem dados suficientes para ordenar os dados por conta própria.