2011-10-12 37 views
10

Ví dụ, nếu dữ liệu của tôi trông như thế này:SQL: chọn N “nhất gần đây” hàng trong thứ tự tăng dần

 
timestamp | message 
100 | hello 
101 | world 
102 | foo 
103 | bar 
104 | baz 

Làm thế nào tôi có thể chọn ba hàng gần đây nhất - 102, 103, 104 - tăng dần gọi món?

Điều hiển nhiên (đối với tôi) … LIMIT 3 ORDER BY timestamp DESC sẽ trả về đúng hàng nhưng thứ tự không chính xác.

+1

Bạn hỏi cho các hàng trong thứ tự giảm dần trong tiêu đề, và _ascending_ trật tự trong câu hỏi, đó là Bạn đang tìm kiếm? – jsvk

+1

D'oh! Cảm ơn. Tôi muốn tăng dần. Đã sửa. –

Trả lời

14

Sử dụng một bên chọn để chọn các hàng chính xác, và một bên ngoài chọn để sắp xếp chúng một cách chính xác:

SELECT timestamp, message 
FROM 
(
    SELECT * 
    FROM your_table 
    ORDER BY timestamp DESC 
    LIMIT 3 
) T1 
ORDER BY timestamp 
+0

Hrm ... Tôi không có một ví dụ chạy tiện ích nào để thử điều đó, nhưng 'EXPLAIN' của SQLite gợi ý rằng sẽ dẫn đến một sắp xếp (hai nếu cột không được lập chỉ mục). Có cách nào để loại bỏ dự phòng này có thể tránh được không? –

+2

Không; SQL không có hoạt động "đảo ngược". Nhưng có lẽ ngôn ngữ mà bạn đang kéo các kết quả không? –

+1

@David: Đợi đã, bạn có lo lắng về việc sắp xếp * ba * bản ghi không? ;) –

Các vấn đề liên quan