You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MySQL查询中IN子查询使用LIMIT报错,求有效解决方法

解决MySQL中LIMIT与IN子查询不兼容的问题

你的SQL意图是获取每个batch_uuid对应id最大的那条记录,但老版本MySQL不支持在IN子查询中使用LIMIT,以下是两种高效的替代方案:

方案一:使用INNER JOIN + 分组聚合(兼容所有MySQL版本)

通过子查询先找出每个batch_uuid的最大id,再关联原表获取完整记录:

SELECT al.*
FROM activity_log al
INNER JOIN (
    SELECT batch_uuid, MAX(id) AS max_id
    FROM activity_log
    GROUP BY batch_uuid
) sub ON al.batch_uuid = sub.batch_uuid AND al.id = sub.max_id;

这个方案性能稳定,只要给activity_log表建立(batch_uuid, id)的复合索引,分组和关联操作都会非常高效。

方案二:使用窗口函数(MySQL 8.0+版本适用)

如果你的MySQL版本是8.0及以上,用ROW_NUMBER()窗口函数会更直观,逻辑和原SQL完全一致:

SELECT *
FROM (
    SELECT *,
           ROW_NUMBER() OVER (PARTITION BY batch_uuid ORDER BY id DESC) AS rn
    FROM activity_log
) t
WHERE rn = 1;

窗口函数会按batch_uuid分组,每组内按id降序排序,标记行号为1的就是每组的最新记录。如果后续需要调整排序规则(比如按时间排序),只需要修改ORDER BY的字段即可。

性能优化建议

无论使用哪种方案,都建议给activity_log表创建复合索引(batch_uuid, id),这能大幅提升分组、排序和关联的执行效率。

内容的提问来源于stack exchange,提问作者ArcticMediaRyan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 18:01:15