Hai điều cần hiểu:
-
Nói chung, các tập kết quả là không có thứ tự trừ khi bạn chỉ định một
ORDER BY
mệnh đề; trong phạm vi mà bạn chỉ định một đơn đặt hàng không nghiêm ngặt (tức làORDER BY
trên các cột không phải là duy nhất), thứ tự mà các bản ghi bằng nhau theo thứ tự đó xuất hiện trong tập kết quả là không xác định.Tôi nghi ngờ rằng bạn có thể đang chỉ định một đơn đặt hàng không nghiêm ngặt như vậy, đây là gốc rễ của các vấn đề của bạn:hãy đảm bảo rằng đơn đặt hàng của bạn nghiêm ngặt bằng cách chỉ định
ORDER BY
qua một tập hợp các cột đủ để xác định duy nhất từng bản ghi mà bạn quan tâm về vị trí cuối cùng của nó trong tập kết quả. -
DISTINCT
có thể sử dụngGROUP BY
, điều này làm cho các kết quả được sắp xếp theo thứ tự của các cột được nhóm; nghĩa là,SELECT DISTINCT a, b, c FROM t
sẽ tạo ra một tập hợp kết quả xuất hiện như thểORDER BY a, b, c
đã được áp dụng. Một lần nữa, việc chỉ định một thứ tự đủ nghiêm ngặt để đáp ứng nhu cầu của bạn sẽ ghi đè ảnh hưởng này.
Sau bản cập nhật của bạn, hãy ghi nhớ điểm số 2 của tôi ở trên, rõ ràng là tác động của việc nhóm các kết quả để đạt được DISTINCT
khiến bạn không thể sắp xếp theo cột không được nhóm p.id
; thay vào đó, bạn muốn:
SELECT t.*
FROM Threads t INNER JOIN Posts p ON t.id = p.threadid
GROUP BY t.id
ORDER BY MAX(p.id) DESC