Due cose da capire:
-
In generale, i set di risultati sono non ordinati a meno che non specifichi un
ORDER BY
clausola; nella misura in cui specifichi un ordine non rigoroso (es.ORDER BY
su colonne non univoche), l'ordine in cui i record che sono uguali in quell'ordine vengono visualizzati all'interno del set di risultati non è definito.Sospetto che tu stia specificando un ordine così non rigoroso, che è la radice dei tuoi problemi:assicurati che il tuo ordine sia rigoroso specificando
ORDER BY
su un insieme di colonne sufficiente per identificare in modo univoco ogni record per il quale tieni alla sua posizione finale nel set di risultati. -
DISTINCT
può utilizzareGROUP BY
, che fa in modo che i risultati vengano ordinati in base alle colonne raggruppate; ovveroSELECT DISTINCT a, b, c FROM t
produrrà un set di risultati che appare come seORDER BY a, b, c
è stato applicato. Anche in questo caso, specificare un ordine sufficientemente rigoroso per soddisfare le tue esigenze annullerà questo effetto.
A seguito del tuo aggiornamento, tenendo presente il mio punto n. 2 sopra, è chiaro che l'effetto del raggruppamento dei risultati per ottenere DISTINCT
rende impossibile quindi ordinare per colonna non raggruppata p.id
; invece, vuoi:
SELECT t.*
FROM Threads t INNER JOIN Posts p ON t.id = p.threadid
GROUP BY t.id
ORDER BY MAX(p.id) DESC