我有一个名为'fileEvents'的表。它有四列(还有更多但与问题无关):id,fileId,操作和时间。
相同的fileId,操作和时间值可以显示在多行中。
我想要的查询很简单,但是我想不到一个可行的查询:从每个文件ID的特定时间起获取最新条目。
我尝试了以下操作。
首先,我将尝试获取自特定时间以来按时间排序的所有条目:
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)]
因此已全部排序。但是现在我只想要唯一的fileIds. 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时,在“ GROUP”附近出现OperationalError:语法错误
此外,当我尝试执行子查询时,首先获取排序列表,然后将其分组,结果是错误的:
SELECT * FROM `fileEvents` WHERE `id` IN (
SELECT `id` FROM `fileEvents` ORDER BY `time` DESC WHERE `time` < 1000
) GROUP BY `fileId`
结果(错误):
[(1, 0, 1, 200), (3, 0, 2, 210), (4, 0, 3, 210)]
我正在寻找的结果是:
[(6, 0, 3, 810), (2, 0, 1, 210), (3, 0, 2, 210)]
有人知道我如何获得想要的结果吗?我想念什么?非常感谢!
此前1个分组问题的典型解决方案是使用相关子查询进行过滤:
select fe.*
from fileevents fe
where fe.time = (
select max(fe1.time)
from fileevents fe1
where fe1.fileid = fe.fileid and fe1.time < 1000
)
为了提高此查询的性能,您需要在(fileid, time)
上建立索引。