Без надлежащего предложения ORDER BY
, SQL result set следует считать неупорядоченным.
Вы должны предоставить столбец для явного хранения порядковых номеров строк. Это может быть отметка времени или столбец auto_increment вашей таблицы.
Обратите внимание, что у вас может быть одновременный доступ к вашему столу. Какое должно быть ожидаемое поведение, если кто-то еще вставляет, когда вы удаляете? Насколько я могу судить, это может привести к ситуации, когда вы сохраняете только «5 последних строк» + «те, которые были добавлены в другую транзакцию».
Если ваш иметь time
колонку для этой цели на вашем столе и а PRIMARY KEY
(или какой-либо другой UNIQUE NOT NULL
столбца) можно было бы написать:
DELETE tbl FROM tbl LEFT JOIN (SELECT * FROM tbl ORDER BY tm DESC LIMIT 5) AS k
ON (tbl.pk) = (k.pk)
WHERE k.`time` IS NULL;
Если у вас есть составной первичный ключ (a,b)
Вы могли бы написать :
DELETE tbl FROM tbl LEFT JOIN (SELECT * FROM tbl ORDER BY tm DESC LIMIT 5) AS k
ON (tbl.a,tbl.b) = (k.a,k.b)
WHERE k.tm IS NULL;
Ваш вопрос непонятен. сначала сделайте это правильно. – ripa
Добавьте 'LIMIT 5, 999999' к этому запросу. А также иметь 'ORDER BY TIME DESC', вместо' ASC' (по умолчанию). [См. Похожий вопрос с тем же нечетким ответом.] (Http://stackoverflow.com/questions/255517/mysql-offset-infinite-rows) –
Поскольку написано все колпачки, это слово 'TIME', ссылающееся на фактическое столбец вашей таблицы - или это какой-то заполнитель? –