Две неща, които трябва да разберете:
-
Най-общо казано, наборите от резултати са неподредени освен ако не посочите
ORDER BY
клауза; до степента, в която посочите нестрога поръчка (т.е.ORDER BY
над неуникални колони), редът, в който записи, които са равни в този ред, се появяват в набора от резултати, е недефиниран.Подозирам, че може да посочите такава нестрога поръчка, която е в основата на вашите проблеми:уверете се, че вашата поръчка е стриктна, като посочите
ORDER BY
върху набор от колони, който е достатъчен за уникално идентифициране на всеки запис, за който се интересувате от крайната му позиция в набора от резултати. -
DISTINCT
може да използваGROUP BY
, което кара резултатите да бъдат подредени по групираните колони; т.е.SELECT DISTINCT a, b, c FROM t
ще произведе набор от резултати, който изглежда сякашORDER BY a, b, c
е приложено. Отново, определянето на достатъчно строг ред, за да отговори на вашите нужди, ще отмени този ефект.
След вашата актуализация, като се има предвид моя точка №2 по-горе, е ясно, че ефектът от групирането на резултатите за постигане на DISTINCT
прави невъзможно след това подреждането по негрупираната колона p.id
; вместо това искате:
SELECT t.*
FROM Threads t INNER JOIN Posts p ON t.id = p.threadid
GROUP BY t.id
ORDER BY MAX(p.id) DESC