Deux choses à comprendre :
-
De manière générale, les jeux de résultats sont non ordonnés sauf si vous spécifiez un
ORDER BY
clause; dans la mesure où vous spécifiez un ordre non strict (c'est-à-direORDER BY
sur des colonnes non uniques), l'ordre dans lequel les enregistrements qui sont égaux dans cet ordre apparaissent dans le jeu de résultats n'est pas défini.Je soupçonne que vous spécifiez peut-être un tel ordre non strict, qui est à l'origine de vos problèmes :assurez-vous que votre ordre est strict en spécifiant
ORDER BY
sur un ensemble de colonnes suffisant pour identifier de manière unique chaque enregistrement pour lequel vous vous souciez de sa position finale dans le jeu de résultats. -
DISTINCT
peut utiliserGROUP BY
, ce qui entraîne le tri des résultats par les colonnes groupées ; c'est-à-direSELECT DISTINCT a, b, c FROM t
produira un jeu de résultats qui apparaît comme siORDER BY a, b, c
a été appliqué. Encore une fois, spécifier un ordre suffisamment strict pour répondre à vos besoins annulera cet effet.
Suite à votre mise à jour, en gardant à l'esprit mon point 2 ci-dessus, il est clair que l'effet de regrouper les résultats pour obtenir DISTINCT
rend impossible le tri ensuite par la colonne non groupée p.id
; à la place, vous voulez :
SELECT t.*
FROM Threads t INNER JOIN Posts p ON t.id = p.threadid
GROUP BY t.id
ORDER BY MAX(p.id) DESC