MySQL 8.0语法错误解决及分组查询需求:按客户取最新数据
解决MySQL 8.0.21分组取最新记录的语法问题
我明白你遇到的问题了——你需要从test表中筛选出communication_type_id=1的数据,按customer_id分组后只保留每个客户updated_at最新的那条记录,但之前的SQL只能返回所有符合条件的排序结果,还碰到了ER_PARSE_ERROR语法错误。
针对MySQL 8.0.21(支持窗口函数),最简洁高效的方法是使用ROW_NUMBER()窗口函数来实现需求,具体SQL如下:
SELECT diary, customer_id, updated_at FROM ( SELECT diary, customer_id, updated_at, ROW_NUMBER() OVER (PARTITION BY customer_id ORDER BY updated_at DESC) AS rn FROM test WHERE communication_type_id = 1 ) AS sub WHERE rn = 1;
代码细节解释:
- 内层子查询中,
PARTITION BY customer_id负责把数据按客户ID分组,确保每个客户的记录单独处理。 ORDER BY updated_at DESC让每组内的记录按照更新时间从新到旧排序,保证最新的记录排在最前面。ROW_NUMBER()函数会给每组内的每条记录分配一个唯一序号rn,每组里最新的记录序号就是1。- 外层查询通过
WHERE rn = 1筛选出每组的第一条记录,也就是每个客户最新的那条数据。
这个方案利用了MySQL 8.0+原生支持的窗口函数,语法规范不会触发解析错误,同时性能也比传统的关联子查询更优。
内容的提问来源于stack exchange,提问作者Mikayeel Ayman




