Två saker att förstå:
-
Generellt sett är resultatuppsättningar oordnade om du inte anger en
ORDER BYklausul; 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. -
DISTINCTkan användaGROUP BY, vilket gör att resultaten sorteras efter de grupperade kolumnerna; det vill sägaSELECT DISTINCT a, b, c FROM tkommer att producera en resultatuppsättning som ser ut som omORDER BY a, b, char 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