Twee dingen om te begrijpen:
-
Over het algemeen zijn resultatensets ongeordend tenzij u een
ORDER BY
. opgeeft clausule; voor zover u een niet-strikte bestelling opgeeft (d.w.z.ORDER BY
over niet-unieke kolommen), is de volgorde waarin records die onder die volgorde gelijk zijn in de resultatenset verschijnen, niet gedefinieerd.Ik vermoed dat je een dergelijke niet-strikte volgorde opgeeft, wat de oorzaak is van je problemen:zorg ervoor dat je bestelling strikt is door
ORDER BY
op te geven over een reeks kolommen die voldoende is om elk record waarvan u de uiteindelijke positie in de resultatenset belangrijk vindt, op unieke wijze te identificeren. -
DISTINCT
magGROUP BY
. gebruiken , waardoor de resultaten worden geordend op de gegroepeerde kolommen; dat wil zeggen,SELECT DISTINCT a, b, c FROM t
zal een resultatenset produceren die eruitziet alsofORDER BY a, b, c
is aangebracht. Nogmaals, het specificeren van een voldoende strikte volgorde om aan uw behoeften te voldoen, zal dit effect teniet doen.
Na uw update, rekening houdend met mijn punt #2 hierboven, is het duidelijk dat het effect van het groeperen van de resultaten om DISTINCT
te bereiken maakt het onmogelijk om vervolgens te bestellen via de niet-gegroepeerde kolom p.id
; in plaats daarvan wil je:
SELECT t.*
FROM Threads t INNER JOIN Posts p ON t.id = p.threadid
GROUP BY t.id
ORDER BY MAX(p.id) DESC