2014-01-09 3 views
6

У меня есть таблица log, в которой я хочу удалить записи каждого пользователя, кроме трех последних записей.Удалить записи За исключением последних трех записей

Схема

DROP TABLE IF EXISTS `log`; 
CREATE TABLE `log` (
    `user_id` int(11) DEFAULT NULL, 
    `timestamp` int(11) DEFAULT NULL 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 

insert into `log`(`user_id`,`timestamp`) values (1,1389257013),(1,1389257014),(1,1389257015),(1,1389257016),(1,1389257017),(2,1389257018),(2,1389257019),(2,1389257020),(2,1389257021),(2,1389257022),(3,1389257023),(3,1389257024); 

Текущая таблица:

id timestamp 
1  1389257013 
1  1389257014 
1  1389257015 
1  1389257016 
1  1389257017 
2  1389257018 
2  1389257019 
2  1389257020 
2  1389257021 
2  1389257022 
3  1389257023 
3  1389257024 

Ожидаемые Таблица

id timestamp  
1  1389257015 
1  1389257016 
1  1389257017 
2  1389257020 
2  1389257021 
2  1389257022 
3  1389257023 
3  1389257024 

ответ

4

Попробуйте ниже SQL:

DELETE FROM log WHERE find_in_set(
    TIMESTAMP, (
     SELECT group_concat(t3) t4 FROM (
      SELECT 1 AS dummy, 
      replace(group_concat(TIMESTAMP ORDER BY TIMESTAMP DESC), concat(SUBSTRING_INDEX(group_concat(TIMESTAMP ORDER BY TIMESTAMP DESC), ',', 3), ','), '') t3 
      FROM log 
      GROUP BY user_id HAVING count(*) > 3 
     ) a GROUP BY dummy 
    ) 
) 

SQL Fiddle

+0

Намного лучше !! Это немного короче предыдущего решения. – neeraj

+0

Я рад, что вам понравилось решение. – kwelsan

7

Попробуйте:

DELETE l FROM `log` l 
WHERE NOT EXISTS (
      SELECT 1 
      FROM (SELECT l.user_id, l.timestamp, 
         IF(@lastUserId = @lastUserId:=user_id, @Idx:[email protected]+1, @Idx:=0) rowNumber 
       FROM `log` l, (SELECT @lastUserId:=0, @Idx:=0) A 
       ORDER BY l.user_id, l.timestamp DESC 
       ) AS A 
      WHERE l.user_id= A.user_idAND l.timestamp = A.timestamp AND rowNumber < 3 
     ); 

Проверьте SQL FIDDLE DEMO

ВЫВОД

| USER_ID | TIMESTAMP | 
|---------|------------| 
|  1 | 1389257015 | 
|  1 | 1389257016 | 
|  1 | 1389257017 | 
|  2 | 1389257020 | 
|  2 | 1389257021 | 
|  2 | 1389257022 | 
|  3 | 1389257023 | 
|  3 | 1389257024 | 
+2

Это Worke д !!. Не могли бы вы объяснить логику? – neeraj

+0

Может ли быть написан запрос для той же проблемы, в которой MAX ('timestamp') будет найден три раза с user_id меньше последней записи того же пользователя? – neeraj

+0

@neeraj Внутренний запрос будет генерировать уникальные номера строк по умолчанию. –

Смежные вопросы