MySQL中MAX()函数返回结果异常,如何获取用户最新位置数据?
问题分析与解决方案
你的SQL问题出在GROUP BY的使用逻辑上:当你GROUP BY tag_id后,直接选择xpos、ypos、date这些非聚合字段时,MySQL(如果是MySQL环境)在未开启ONLY_FULL_GROUP_BY模式下,会从该分组的任意一条记录中取这些字段的值,而非与MAX(date)对应的那条最新记录。这就是为什么你看到MAX(date)是最新日期,但其他字段是旧数据的原因。
下面是两种可靠的解决方案:
方案1:子查询关联(兼容所有MySQL版本)
先通过子查询获取每个tag_id的最新日期,再关联原表拿到对应位置数据:
SELECT p.tag_id, p.xpos, p.ypos, p.adsoyad, p.date FROM `lt_position` p INNER JOIN ( SELECT tag_id, MAX(date) AS max_date FROM `lt_position` WHERE map_id = "750" GROUP BY tag_id ) latest ON p.tag_id = latest.tag_id AND p.date = latest.max_date WHERE p.map_id = "750"
方案2:窗口函数(MySQL 8.0+推荐)
利用ROW_NUMBER()窗口函数给每个用户的记录按日期降序排名,取排名第一的最新记录:
SELECT tag_id, xpos, ypos, adsoyad, date FROM ( SELECT tag_id, xpos, ypos, adsoyad, date, ROW_NUMBER() OVER (PARTITION BY tag_id ORDER BY date DESC) AS rn FROM `lt_position` WHERE map_id = "750" ) t WHERE rn = 1
这两种方法都能精准获取每个用户最后一次提交的xpos和ypos数据,不会出现字段不匹配的问题。
内容的提问来源于stack exchange,提问作者Ugur Harlar
相关产品推荐
相关产品推荐

