SQL查询每个bot_id对应最新记录,现有GROUP BY语句失效如何解决
问题原因
原SQL语句执行逻辑不符合需求,核心是SQL的执行顺序优先级问题:GROUP BY 执行顺序早于 ORDER BY,所以你实际执行逻辑是先按bot_id分组,直接取了每组存储顺序的第一条记录,再对分组后的少量结果排序,调整排序规则自然不会影响分组时取数的结果。
解决方案
方案1:窗口函数写法(通用标准写法,兼容MySQL8.0+、PostgreSQL、SQL Server等所有支持SQL:2003标准的数据库)
用ROW_NUMBER()窗口函数给每个bot_id分组内的记录按请求时间倒序编号,过滤出编号为1的就是每组最新记录:
SELECT bot_id, id FROM ( SELECT bot_id, id, ROW_NUMBER() OVER(PARTITION BY bot_id ORDER BY request_time DESC) AS row_num FROM t_request_history ) AS temp_table WHERE row_num = 1;
方案2:MySQL5.x兼容写法(针对不支持窗口函数的旧版本MySQL)
先对全表按请求时间倒序排序后再分组,即可让分组时取到每组最新的记录:
SELECT bot_id, id FROM ( SELECT bot_id, id FROM t_request_history ORDER BY request_time DESC LIMIT 1000000 ) AS temp_table GROUP BY bot_id;
注意:添加LIMIT是为了避免高版本MySQL优化器自动忽略子查询内的排序规则,数值可以根据你的表数据量调整到大于总记录数即可。
内容的提问来源于stack exchange,提问作者GhostJumper
相关产品推荐
相关产品推荐

