Страницы

Поиск по вопросам

среда, 25 декабря 2019 г.

оставить только последних N записей в истории каждого пользователя

#mysql #sql


Существует таблица

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
    


Ответы

Ответ 1



Обходим ограничение при помощи вложенного запроса за место прямого доступа к таблице: 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

Комментариев нет:

Отправить комментарий