我有一个名为 Info 的表:
int objectId;
int time;
int x, y;
系统中存在大量冗余数据——即objectId
不是唯一的。对于每个 objectId
,可以有多个 time, x, y
条目。
我想检索每个对象的最新位置列表。我从这个查询开始:
SELECT * FROM Info GROUP BY objectId
这正是我正在寻找的那种列表。但是我还想获得每个对象的最新时间,所以我尝试了:
SELECT * FROM Info GROUP BY objectId ORDER BY time DESC
这给了我一个 time
信息的下降列表。但是,我不认为它做了我想要的 - 即返回每个对象的最新 time, x, y
。
谁能想象一个查询来做我想做的事?
更新 我已经尝试了前三个解决方案,以了解它们在包含大约 50,000 个信息的数据集上的表现如何。以下是结果:
-- NO INDEX: forever
-- INDEX: 7.67 s
SELECT a.*
FROM Info AS a
LEFT OUTER JOIN Info AS b ON (a.objectId = b.objectId AND a.time < b.time)
WHERE b.objectId IS NULL;
-- NO INDEX: 8.05 s
-- INDEX: 0.17 s
select a.objectId, a.time, a.x, a.y
from Info a,
(select objectId, max(time) time from Info group by objectId) b
where a.objectId = b.objectId and a.time = b.time;
-- NO INDEX: 8.30 s
-- INDEX: 0.18 s
SELECT A.time, A.objectId, B.x, B.y
FROM
(
SELECT max(time) as time, objectId
FROM Info
GROUP by objectId
) as A
INNER JOIN Info B
ON A.objectId = b.objectId AND A.time = b.time;
在一定程度上,where
似乎优于 inner join
。
最佳答案
SELECT A.time, A.objectID, B.X, B.Y
FROM
(
SELECT max(time) as time, objectID
FROM table
GROUP by objectID
) as A
INNER JOIN table B
ON A.objectID = b.objectID AND A.Time = b.Time
投票者,如果 x 和 y 在时间线中的任何一点递减,解决方案将不起作用。
关于mysql - 帮忙写个query : Confusion over order of operations of GROUP BY and ORDER BY,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/236778/