2015-09-24 2 views
0

У меня есть таблица со столбцами, как это:MySQL - Удаление всех, но новые строки с композитным ключом

id timestamp content

где ID это строка, и временные метки DEFAULT CURRENT_TIMESTAMP.

id и timestamp вместе образуют составной ключ, так что вы можете выбрать самую новую Колум что-то вроде:

select * from table where id = 'text-here' order by timestamp desc limit 1

Теперь у меня есть проблема, когда я хочу, чтобы удалить все, кроме последней записи для каждого id, но я понятия не имею, как это сделать. Если у него был автоматически увеличивающий первичный ключ, я мог бы использовать подзапрос, чтобы выбрать те, которые нужно сохранить и использовать NOT IN, как это показано на многочисленных вопросах здесь, но я не знаю, как это сделать с помощью сложного ключа.

+0

'WHERE метка <> MAX (метка времени)' – hjpotter92

+0

@ hjpotter92 - Я не понимаю, как это будет учет для меняющихся 'id' - не будет ли удалять все, кроме одной строки, независимо от' id'? –

+0

Вышеуказанное условие должно быть 'AND'ed w/your' id'. – hjpotter92

ответ

3

Можно без подзапроса тоже:

DELETE t 
FROM t 
JOIN t AS t2 ON t.timestamp < t2.timestamp AND t.id = t2.id; 

http://sqlfiddle.com/#!9/1ff88/1

+0

Спасибо, это сработало отлично! –

+0

Хорошо. Только для информации версия @GiorgosBetsos может быть быстрее в некоторых случаях, в зависимости от количества разных идентификаторов и временных меток. – jkavalik

3

Следующий запрос:

DELETE mytable 
FROM mytable 
INNER JOIN (SELECT id, MAX(`timestamp`) AS `timestamp` 
      FROM mytable 
      GROUP BY id) AS t 
ON mytable.id = t.id AND mytable.`timestamp` < t.`timestamp` 

удаляет все, но новейший рекорд за id от mytable.

Demo here

+0

Спасибо, это сработало отлично. Тем не менее, я выбираю ответ jkavalik, потому что он не полагается на подзапрос, который более портативен. –

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