Страницы

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

вторник, 27 ноября 2018 г.

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

Существует таблица
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

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

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