Dua hal yang perlu dipahami:
-
Secara umum, kumpulan hasil tidak berurutan kecuali jika Anda menentukan
ORDER BYayat; sejauh Anda menentukan pesanan tidak ketat (yaituORDER BYdi atas kolom non-unik), urutan di mana catatan yang sama di bawah urutan itu muncul dalam hasil yang tidak ditentukan.Saya menduga Anda mungkin menentukan urutan yang tidak ketat, yang merupakan akar masalah Anda:pastikan bahwa pemesanan Anda ketat dengan menentukan
ORDER BYlebih dari satu set kolom yang cukup untuk secara unik mengidentifikasi setiap catatan yang Anda pedulikan dengan posisi akhirnya di kumpulan hasil. -
DISTINCTboleh menggunakanGROUP BY, yang menyebabkan hasil diurutkan berdasarkan kolom yang dikelompokkan; yaitu,SELECT DISTINCT a, b, c FROM takan menghasilkan hasil yang muncul seolah-olahORDER BY a, b, ctelah diterapkan. Sekali lagi, menentukan urutan yang cukup ketat untuk memenuhi kebutuhan Anda akan mengesampingkan efek ini.
Mengikuti pembaruan Anda, mengingat poin saya #2 di atas, jelas bahwa efek pengelompokan hasil untuk mencapai DISTINCT membuat tidak mungkin untuk kemudian memesan dengan kolom yang tidak dikelompokkan p.id; sebagai gantinya, Anda ingin:
SELECT t.*
FROM Threads t INNER JOIN Posts p ON t.id = p.threadid
GROUP BY t.id
ORDER BY MAX(p.id) DESC