Två saker att förstå:
-
Generellt sett är resultatuppsättningar oordnade om du inte anger en
ORDER BY
klausul; i den mån du anger en icke strikt ordning (dvs.ORDER BY
över icke-unika kolumner), är ordningen i vilken poster som är lika under den ordningen visas i resultatuppsättningen odefinierad.Jag misstänker att du kanske anger en sådan icke-strikt beställning, vilket är roten till dina problem:se till att din beställning är strikt genom att ange
ORDER BY
över en uppsättning kolumner som är tillräcklig för att unikt identifiera varje post som du bryr dig om dess slutliga position i resultatuppsättningen. -
DISTINCT
kan användaGROUP BY
, vilket gör att resultaten sorteras efter de grupperade kolumnerna; det vill sägaSELECT DISTINCT a, b, c FROM t
kommer att producera en resultatuppsättning som ser ut som omORDER BY a, b, c
har tillämpats. Återigen, att specificera en tillräckligt strikt ordning för att möta dina behov kommer att åsidosätta denna effekt.
Efter din uppdatering, med tanke på min punkt #2 ovan, är det tydligt att effekten av att gruppera resultaten för att uppnå DISTINCT
gör det omöjligt att sedan sortera efter den icke-grupperade kolumnen p.id
; istället vill du:
SELECT t.*
FROM Threads t INNER JOIN Posts p ON t.id = p.threadid
GROUP BY t.id
ORDER BY MAX(p.id) DESC