Dos cosas para entender:
-
En términos generales, los conjuntos de resultados son desordenados a menos que especifique un
ORDER BY
cláusula; en la medida en que especifique un orden no estricto (es decir,ORDER BY
sobre 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 BY
sobre 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. -
DISTINCT
puede usarGROUP BY
, lo que hace que los resultados se ordenen por columnas agrupadas; es decir,SELECT DISTINCT a, b, c FROM t
producirá un conjunto de resultados que aparece como siORDER BY a, b, c
ha 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