You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动