#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
Комментариев нет:
Отправить комментарий