2011-01-18 23 views
5

Tôi có một LoginTime bảng như thế này:Xóa số N của các hồ sơ cũ từ bảng trong mysql

id | user_id | datetime 
1 | 1  | 2011-01-19 18:51:01 
2 | 1  | 2011-01-19 18:51:02 
3 | 1  | 2011-01-19 18:51:03 
4 | 1  | 2011-01-19 18:51:04 
5 | 1  | 2011-01-19 18:51:05 
6 | 1  | 2011-01-19 18:51:06 
7 | 1  | 2011-01-19 18:51:07 
8 | 1  | 2011-01-19 18:51:08 
9 | 1  | 2011-01-19 18:51:09 
10 | 2  | 2011-01-19 18:51:10 

Tôi muốn giữ lại chỉ có 5 mới nhất (theo cột 'datetime') hồ sơ và xóa tất cả các kỷ lục trước đó ở đâu user_id=1

Có thể đạt được điều này với một truy vấn mysql không?

Trả lời

4

Tôi tin rằng điều này sẽ làm việc ...

DELETE FROM LoginTime WHERE id IN (
    SELECT id 
    WHERE user_id = 1 
    ORDER BY datetime DESC 
    LIMIT 0, 5 
) 
+0

'WHERE user_id = 1' và' ORDER BY datetime' – Awan

+1

** Lỗi: ** 'Lỗi SQL: [unixODBC] [MySQL] [ODBC 3.51 Driver] [mysqld-5.1.41-3ubuntu12.3] Phiên bản MySQL này chưa hỗ trợ 'LIMIT & IN/ALL/ANY/SOME subquery', S1000 trạng thái SQL trong SQLExecDirect' ....... Is it lỗi phiên bản mysql hoặc lỗi phiên bản kết nối odbc. – Awan

+0

Tôi đoán bạn sẽ phải thử một cái gì đó khác:/ – jocull

2
delete LoginTime 
from 
    LoginTime 
left join 
    (
    select id 
    from LoginTime 
    where user_id=1 
    order by `datetime` desc 
    limit 5 
) as not_to_delete 
on LoginTime.id=not_to_delete.id 
where 
    not_to_delete.id is null; 

PS: xin vui lòng không sử dụng CamelCase cho tên bảng, và tránh sử dụng các từ khóa dành riêng cho các tên cột

+0

Cảm ơn bạn đã trả lời .. Nhưng đây là một vấn đề .. Nếu tôi sử dụng 'user_id = 3' không tồn tại trong bảng thì nó sẽ xóa tất cả các bản ghi của bảng. – Awan

+0

bạn có thể thêm vào số đếm trong phần kết nối bên trái và số đếm đang kiểm tra> = 1 – ajreal

8
DELETE 
FROM LoginTime 
WHERE user_id = 1 
ORDER BY datetime ASC 
LIMIT 5 
+0

Vì điều đó, đó là giải pháp đơn giản và tốt nhất. – acme

0
delete LoginTime 
from 
    LoginTime 

left join 
    (
    select id 
    from LoginTime 
    where user_id=1 
    order by datetime desc 
    limit 5 
) as not_to_delete 
on LoginTime.id=not_to_delete.id 

left join 
    (
    select id 
    from LoginTime 
    where user_id=1 
) as existance 
on LoginTime.id=existance.id 

where 
    not_to_delete.id is null and existance.id is not null; 
Các vấn đề liên quan