帮助编写查询:混淆GROUP BY和ORDER BY的操作顺序

Fra*_*ger 2 mysql sql database

我有一个名为Info of this schema的表:

int objectId;
int time;
int x, y;
Run Code Online (Sandbox Code Playgroud)

系统中有很多冗余数据 - 也就是说,objectId不是唯一的.每个objectId可以有多个条目time, x, y.

我想检索每个对象的最新位置列表.我开始使用此查询:

SELECT * FROM Info GROUP BY objectId
Run Code Online (Sandbox Code Playgroud)

这让我只是那种我想要的清单.但是我想要获得每个Object的最新时间,所以我试过:

SELECT * FROM Info GROUP BY objectId ORDER BY time DESC
Run Code Online (Sandbox Code Playgroud)

这给了我一个下载的信息time列表.但是,我不认为它做了我想要的 - 这是time, x, y每个对象的最新信息.

任何人都可以想象一个查询来做我想要的吗?

更新我已经尝试了前三个解决方案,以了解它们在大约50,000个Infos的数据集上如何相互作用.结果如下:

-- 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;
Run Code Online (Sandbox Code Playgroud)

一定程度上,它似乎where表现优异inner join.

Eoi*_*ell 7

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
Run Code Online (Sandbox Code Playgroud)

如果x&y在时间线的任何一点递减,则投票者,解决方案将无效.


And*_*isi 6

一种方法是使用子查询.

select distinct 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
Run Code Online (Sandbox Code Playgroud)

编辑:添加DISTINCT以防止重复行,如果一个objectId具有相同时间的多个记录.如果有必要,取决于您的数据,问题作者提到有许多重复的行.(Tomalak补充)