Две неща, които трябва да разберете:
-
Най-общо казано, наборите от резултати са неподредени освен ако не посочите
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