Dvě věci k pochopení:
-
Obecně řečeno, sady výsledků jsou neuspořádané pokud nezadáte
ORDER BY
doložka; v rozsahu, v jakém určíte nepřísné pořadí (tj.ORDER BY
nad nejedinečnými sloupci) není definováno pořadí, ve kterém se v sadě výsledků objevují záznamy, které jsou v tomto pořadí stejné.Mám podezření, že zadáváte takto nepřísné pořadí, což je kořen vašich problémů:ujistěte se, že vaše objednávka je přísná zadáním
ORDER BY
přes sadu sloupců, která je dostatečná k jedinečné identifikaci každého záznamu, u kterého vám záleží na jeho konečné pozici v sadě výsledků. -
DISTINCT
může používatGROUP BY
, což způsobí, že výsledky budou seřazeny podle seskupených sloupců; to znamenáSELECT DISTINCT a, b, c FROM t
vytvoří sadu výsledků, která vypadá jakoORDER BY a, b, c
bylo aplikováno. Opět platí, že zadání dostatečně přísného pořadí, aby vyhovovalo vašim potřebám, přepíše tento efekt.
Po vaší aktualizaci, s ohledem na můj bod č. 2 výše, je jasné, že účinek seskupení výsledků k dosažení DISTINCT
znemožňuje následné řazení podle neseskupeného sloupce p.id
; místo toho chcete:
SELECT t.*
FROM Threads t INNER JOIN Posts p ON t.id = p.threadid
GROUP BY t.id
ORDER BY MAX(p.id) DESC