У меня есть таблица с именем fileEvents. Он имеет четыре столбца (их больше, но не имеет отношения к вопросу): id, fileId, action и time.
Одинаковые значения fileId, action и time могут отображаться в нескольких строках.
Запрос, который мне нужен, прост, но я не могу придумать рабочий: получить последнюю запись с момента указанного c времени для каждого fileId.
Я пробовал следующее.
Сначала Я постараюсь просто отсортировать все записи по времени, начиная с указанного c time:
SELECT * FROM `fileEvents` ORDER BY `time` DESC WHERE `time` < 1000
Результат, конечно, нормальный (id
, action
, fileId
, time
):
[(6, 0, 3, 810), (5, 0, 3, 410), (2, 0, 1, 210), (3, 0, 2, 210), (4, 0, 3, 210), (1, 0, 1, 200)]
Так все отсортировано. Но теперь мне нужен только уникальный fileId s. So I add a GROUP BY
fileId`:
SELECT * FROM `fileEvents` GROUP BY `fileId` ORDER BY `time` DESC WHERE `time` < 1000
Что, конечно, неверно. Потому что сначала он сгруппирует результаты, а затем сортирует их, но они уже сгруппированы, поэтому сортировки нет:
[(3, 0, 2, 210), (4, 0, 3, 210), (1, 0, 1, 200)]
Когда я пытаюсь отменить GROUP BY и ORDER BY, я получаю OperationalError: near «ГРУППА»: синтаксическая ошибка
Также, когда я пытаюсь выполнить подзапрос, где я сначала получаю отсортированный список, а затем группирую их, результат неверен:
SELECT * FROM `fileEvents` WHERE `id` IN (
SELECT `id` FROM `fileEvents` ORDER BY `time` DESC WHERE `time` < 1000
) GROUP BY `fileId`
С (неправильным ) result:
[(1, 0, 1, 200), (3, 0, 2, 210), (4, 0, 3, 210)]
Результат, который я ищу:
[(6, 0, 3, 810), (2, 0, 1, 210), (3, 0, 2, 210)]
Кто-нибудь знает, как я могу получить желаемый результат? Что мне не хватает? Большое спасибо!