Существует таблица
CREATE TABLE `user_histories` (
`id` int(10) UNSIGNED NOT NULL,
`user` int(10) UNSIGNED NOT NULL,
`item` int(10) NOT NULL,
`created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP
)
INSERT INTO `user_histories` (`id`, `user`, `item`, `created_at`) VALUES
(25, 1, 5807, '2018-06-16 11:52:49'),
(26, 1, 8415, '2018-06-16 11:58:30'),
(27, 1, 7219, '2018-06-16 12:33:50'),
(28, 1, 1518, '2018-06-17 07:31:24'),
(29, 1, 9089, '2018-06-17 07:41:53'),
(30, 1, 3454, '2018-07-13 14:41:55'),
(31, 1, 5595, '2018-07-13 15:19:36'),
(32, 1, 7611, '2018-07-13 15:21:27'),
(33, 2, 1518, '2018-07-20 16:19:29'),
... (10 строк)
(40, 2, 7960, '2018-07-20 16:20:11'),
(41, 3, 5609, '2018-07-20 16:20:15'),
(42, 3, 8705, '2018-07-20 16:20:20'),
(43, 3, 1737, '2018-07-20 16:22:56'),
(44, 3, 7260, '2018-07-20 16:23:09');
в которой хранятся история просмотренных пользователем страниц.
Как при помощи одного запроса удалить записи (историю посещений), оставив для каждого пользователя только последних 5(по времени)?
Учитывая что mysql не поддерживает limit в подзапросах и не позволяет использовать offset в операторе DELETE
Ответ
Обходим ограничение при помощи вложенного запроса за место прямого доступа к таблице:
DELETE uh
FROM user_histories uh
WHERE
uh.created_at < (
SELECT MIN(uh1.created_at)
FROM (
SELECT * FROM user_histories
) uh1
WHERE
uh1.user = uh.user
AND uh1.created_at > uh.created_at
HAVING COUNT(*) >= 5)
Идея взята отсюда: https://dba.stackexchange.com/questions/39484/delete-the-n-oldest-entries-grouped-by-multiple-columns
Комментариев нет:
Отправить комментарий