2011-01-18 4 views
5

У меня есть LoginTime таблицу, как это:Удалить N количество старых записей из таблицы в 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 

Я хочу сохранить только 5 последних (по столбцам «даты-времени») записи и удалить все предыдущие записи где user_id=1

Возможно ли достичь этого с помощью одного запроса mysql?

ответ

4

Я считаю, что это будет работать ...

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

'WHERE user_id = 1' и' ORDER BY datetime' – Awan

+1

** Ошибка: ** 'Ошибка SQL: [unixODBC] [MySQL] [ODBC 3.51 Драйвер] [mysqld-5.1.41-3ubuntu12.3] Эта версия MySQL еще не поддерживает «LIMIT & IN/ALL/ANY/SOME subquery», состояние SQL S1000 в SQLExecDirect' ....... Это ошибка версии mysql или ошибка версии соединения odbc. – Awan

+0

Я думаю, вам придется попробовать что-то еще:/ – 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: пожалуйста, не используйте верблюжий для имени таблицы, и избегать использования зарезервированных ключевых слов для имени столбца

+0

Спасибо за ваш ответ .. Но вот проблема. Если я использую 'user_id = 3', который не существует в таблице, то он удаляет все записи таблицы. – Awan

+0

вы можете добавить счет в левом соединении, а где проверять count> = 1 – ajreal

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

Идти для этого, это самое простое и лучшее решение. – 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; 
Смежные вопросы