Dwie rzeczy do zrozumienia:
-
Ogólnie mówiąc, zestawy wyników są nieuporządkowane chyba że określisz
ORDER BY
klauzula; w zakresie, w jakim określisz nie ścisłą kolejność (np.ORDER BY
nad nieunikalnymi kolumnami), kolejność, w jakiej rekordy, które są równe w tej kolejności pojawiają się w zestawie wyników, jest niezdefiniowana.Podejrzewam, że możesz określać taką nieścisłą kolejność, która jest źródłem twoich problemów:upewnij się, że twoja kolejność jest ścisła, określając
ORDER BY
nad zestawem kolumn, który jest wystarczający do jednoznacznej identyfikacji każdego rekordu, dla którego zależy Ci na jego końcowej pozycji w zestawie wyników. -
DISTINCT
może używaćGROUP BY
, co powoduje, że wyniki są uporządkowane według zgrupowanych kolumn; czyliSELECT DISTINCT a, b, c FROM t
wygeneruje zestaw wyników, który wygląda tak, jakbyORDER BY a, b, c
został zastosowany. Ponownie, określenie wystarczająco ścisłej kolejności, aby spełnić Twoje potrzeby, unieważni ten efekt.
Po aktualizacji, mając na uwadze mój punkt 2 powyżej, jasne jest, że efekt grupowania wyników w celu uzyskania DISTINCT
uniemożliwia następnie uporządkowanie według niezgrupowanej kolumny p.id
; zamiast tego chcesz:
SELECT t.*
FROM Threads t INNER JOIN Posts p ON t.id = p.threadid
GROUP BY t.id
ORDER BY MAX(p.id) DESC