Dwie rzeczy do zrozumienia:
-
Ogólnie mówiąc, zestawy wyników są nieuporządkowane chyba że określisz
ORDER BYklauzula; w zakresie, w jakim określisz nie ścisłą kolejność (np.ORDER BYnad 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 BYnad 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. -
DISTINCTmoże używaćGROUP BY, co powoduje, że wyniki są uporządkowane według zgrupowanych kolumn; czyliSELECT DISTINCT a, b, c FROM twygeneruje zestaw wyników, który wygląda tak, jakbyORDER BY a, b, czostał 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