Dos cosas para entender:
-
En términos generales, los conjuntos de resultados son desordenados a menos que especifique un
ORDER BYcláusula; en la medida en que especifique un orden no estricto (es decir,ORDER BYsobre columnas no únicas), el orden en que los registros que son iguales bajo ese orden aparecen dentro del conjunto de resultados no está definido.Sospecho que puede estar especificando un orden tan poco estricto, que es la raíz de sus problemas:asegúrese de que su pedido sea estricto especificando
ORDER BYsobre un conjunto de columnas que es suficiente para identificar de forma única cada registro cuya posición final le interesa en el conjunto de resultados. -
DISTINCTpuede usarGROUP BY, lo que hace que los resultados se ordenen por columnas agrupadas; es decir,SELECT DISTINCT a, b, c FROM tproducirá un conjunto de resultados que aparece como siORDER BY a, b, cha sido aplicado. Nuevamente, especificar un orden suficientemente estricto para satisfacer sus necesidades anulará este efecto.
Después de su actualización, teniendo en cuenta mi punto n.° 2 anterior, está claro que el efecto de agrupar los resultados para lograr DISTINCT hace que sea imposible ordenar por la columna no agrupada p.id; en cambio, quieres:
SELECT t.*
FROM Threads t INNER JOIN Posts p ON t.id = p.threadid
GROUP BY t.id
ORDER BY MAX(p.id) DESC