MySQL中DATETIME字段ORDER BY DESC排序不生效问题技术求助
问题原因与解决方案
原语句错误点
- GROUP BY字段使用错误:子查询中GROUP BY的
pe_DeathAncestoryFinal_pilotname不属于pe_LogEvent表,分组逻辑完全不符合取对应pilot最新时间的需求 - 未使用聚合函数就分组:MySQL非严格模式下,GROUP BY后未对查询字段加聚合函数,会返回分组内的任意一行数据,后续的ORDER BY是对分组后的结果排序,无法作用到同一个pilot的多条死亡记录上,自然拿不到最新时间
- 子查询未限制返回行数:即使排序生效,子查询返回多行结果赋值给单个时间字段也会出错,缺少LIMIT 1取第一条记录的逻辑
- DISTINCT和GROUP BY混用完全多余,属于逻辑冗余
修复方案
方案1:使用MAX聚合直接取最新时间(推荐,性能更高更稳定)
直接用MAX()函数取对应pilot死亡事件的最大时间,不需要排序,天然符合取最新时间的需求:
UPDATE pe_DeathAncestoryFinal SET pe_DeathAncestoryFinal_lastpilotdeathtime = ( SELECT MAX(pe_LogEvent_datetime) FROM pe_LogEvent WHERE pe_DeathAncestoryFinal.pe_DeathAncestoryFinal_pilotid = pe_LogEvent.pe_LogEvent_pilotid AND pe_LogEvent_type = "pilot_death" ) WHERE pe_DeathAncestoryFinal_lastpilotdeathtime IS NULL;
方案2:保留ORDER BY写法的修复版本
如果要坚持用排序逻辑,需要删除多余的GROUP BY、DISTINCT,加LIMIT 1取排序后的第一条最新记录:
UPDATE pe_DeathAncestoryFinal SET pe_DeathAncestoryFinal_lastpilotdeathtime = ( SELECT pe_LogEvent_datetime FROM pe_LogEvent WHERE pe_DeathAncestoryFinal.pe_DeathAncestoryFinal_pilotid = pe_LogEvent.pe_LogEvent_pilotid AND pe_LogEvent_type = "pilot_death" ORDER BY pe_LogEvent_datetime DESC LIMIT 1 ) WHERE pe_DeathAncestoryFinal_lastpilotdeathtime IS NULL;
说明
两种方案都可以正确拿到对应pilot的最新死亡时间,优先推荐方案1,聚合函数的执行效率比排序更高,也不会出现排序逻辑错误导致的取值问题。
内容的提问来源于stack exchange,提问作者Dr. No
相关产品推荐
相关产品推荐

