Duas coisas para entender:
-
De um modo geral, os conjuntos de resultados são não ordenados a menos que você especifique umORDER BY
cláusula; na medida em que você especificar um pedido não restrito (ou seja,ORDER BY
em 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 BY
sobre 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.
-
DISTINCT
pode usarGROUP BY
, que faz com que os resultados sejam ordenados pelas colunas agrupadas; isto é,SELECT DISTINCT a, b, c FROM t
irá produzir um conjunto de resultados que aparece como seORDER BY a, b, c
foi 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