Duas coisas para entender:
-
De um modo geral, os conjuntos de resultados são não ordenados a menos que você especifique umORDER BYcláusula; na medida em que você especificar um pedido não restrito (ou seja,ORDER BYem colunas não exclusivas), a ordem na qual os registros que são iguais sob essa ordenação aparecem no conjunto de resultados é indefinida.
Suspeito que você esteja especificando uma ordem não restrita, que é a raiz de seus problemas:certifique-se de que sua ordem seja rigorosa especificandoORDER BYsobre um conjunto de colunas que é suficiente para identificar exclusivamente cada registro para o qual você se importa com sua posição final no conjunto de resultados.
-
DISTINCTpode usarGROUP BY, que faz com que os resultados sejam ordenados pelas colunas agrupadas; isto é,SELECT DISTINCT a, b, c FROM tirá produzir um conjunto de resultados que aparece como seORDER BY a, b, cfoi aplicado. Novamente, especificar uma ordem suficientemente estrita para atender às suas necessidades anulará esse efeito.
Após sua atualização, tendo em mente meu ponto 2 acima, fica claro que o efeito de agrupar os resultados para alcançar
DISTINCT torna impossível ordenar pela coluna não agrupada p.id; em vez disso, você deseja:SELECT t.*
FROM Threads t INNER JOIN Posts p ON t.id = p.threadid
GROUP BY t.id
ORDER BY MAX(p.id) DESC