mysql - 帮忙写个query : Confusion over order of operations of GROUP BY and ORDER BY

标签 mysql sql database

我有一个名为 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/

相关文章:

sql - oracle - 需要提交哪些语句?

mysql - SQL 对于给定的主键,我想添加匹配的数据

php - 存储过程中的准备语句是否可以避免 SQL 注入(inject)?

mysql - 在Mysql中选择彼此相邻的日期

php - 如何获得序列化输出数据?

php - 删除多个字段失败

database - 从数据库中检索图像并使用 JSTL 在 JSP 中显示它

mysql - 如何删除ID在特定范围内的行?

SQL - 当第 1 行满足 Case 条件时更改第 3 行的值

mysql - 从表中的多个值中选择不在数组中的位置