2011-06-29 30 views

Trả lời

32

Để xóa tất cả trừ 10 bản ghi mới nhất.

delete 
from test 
where id not in (
    select id 
    from test 
    order by date desc 
    limit 10 
) 
+0

Cảm ơn. Nhưng làm cách nào để biết tôi cần xóa bao nhiêu hồ sơ? – ahmd0

+1

Bạn không, truy vấn đó sẽ xóa tất cả trừ 10 bản ghi mới nhất –

+0

Cảm ơn, nó đã hoạt động. Mặc dù câu lệnh sql của bạn không cần * – ahmd0

1

Theo SQLite documentation:

Nếu SQLite được biên soạn với các tùy chọn thời gian biên dịch SQLITE_ENABLE_UPDATE_DELETE_LIMIT thì cú pháp của câu lệnh DELETE được mở rộng bằng cách thêm TRÌNH TỰ tùy chọn BY và LIMIT khoản.

(...)

Nếu câu lệnh DELETE có một mệnh đề ORDER BY, sau đó tất cả các hàng đó sẽ bị xóa trong sự vắng mặt của mệnh đề LIMIT đều được sắp xếp theo ORDER BY. M hàng đầu tiên, trong đó M là giá trị được tìm thấy bằng cách đánh giá biểu thức mệnh đề OFFSET, được bỏ qua và N sau, trong đó N là giá trị của biểu thức LIMIT, sẽ bị xóa. Nếu còn ít hơn N hàng sau khi lấy mệnh đề OFFSET, hoặc nếu mệnh đề LIMIT được đánh giá thành giá trị âm, thì tất cả các hàng còn lại sẽ bị xóa.

này sẽ cho phép bạn viết:

DELETE FROM table WHERE expr ORDER BY date DESC LIMIT -1 OFFSET 10 
+0

~ "Nếu còn ít hơn N hàng". -1 có ý nghĩa gì ở đây? –

+0

@IgorGanapolsky Nhìn vào câu cuối cùng của đoạn trích dẫn: _if mệnh đề LIMIT được đánh giá thành giá trị âm, thì tất cả các hàng còn lại đều bị xóa_. –

+0

Vì vậy, nếu có ít hơn 10 hàng trong bảng hoàn toàn, thì tất cả chúng sẽ bị xóa? –

2

để giữ chỉ 10 hồ sơ cuối cùng, suy nghĩ ngược.

Để xóa 10 hồ sơ cũ:

DELETE FROM Table_name 
WHERE date in (SELECT date FROM Table_name ORDER BY Date Desc Limit -1 
       OFFSET (select count(*)-10 from Table_name)); 

Hãy cho tôi biết làm thế nào nó làm việc cho bạn!

+0

Ngày có phải ở định dạng nhất định - như yyyy-mm-dd không? –

0

Giả sử bạn có một cột id mà là một dãy số (AUTO INCREMENT), bạn có thể sử dụng như sau:

DELETE FROM table_name 
WHERE id < (
    SELECT MIN(id) 
    FROM (SELECT id 
      FROM table_name 
      ORDER BY id DESC 
      LIMIT num_of_records_to_keep)) 

Truy vấn tương tự có thể được sử dụng khi sử dụng một cột timestamp (chỉ cần thay thế id với timestamp của bạn cột)

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