如何解决带多表JOIN的MySQL子查询聚合字段实现问题
目标查询完全可基于给定三张基础表实现
实现逻辑说明
需要新增的g.enum_max字段,本质是取与当前关联行同属一个blue_id分组下,green表所有记录的enum最大值。这类分组取聚合值的逻辑和常见的datetime类参考示例核心思路完全一致,不需要额外适配复杂语法,没有特殊理解门槛。
提供两种可直接落地的完整查询写法:
- 写法1:预聚合关联写法(数据量大时性能更优)
SELECT r.*, g.enum AS g_enum, max_g.enum_max, b.title AS b_title FROM red AS r LEFT JOIN green AS g ON r.green_id = g.id LEFT JOIN blue AS b ON g.blue_id = b.id LEFT JOIN ( -- 提前按blue_id分组计算最大enum值,避免重复扫描green表 SELECT blue_id, MAX(enum) AS enum_max FROM green GROUP BY blue_id ) AS max_g ON g.blue_id = max_g.blue_id WHERE r.id = 1;
- 写法2:标量子查询写法(逻辑直观,适合快速开发)
SELECT r.*, g.enum AS g_enum, -- 对应当前行关联的blue_id,直接计算green表的enum最大值 (SELECT MAX(enum) FROM green WHERE blue_id = g.blue_id) AS enum_max, b.title AS b_title FROM red AS r LEFT JOIN green AS g ON r.green_id = g.id LEFT JOIN blue AS b ON g.blue_id = b.id WHERE r.id = 1;
结果验证
当筛选r.id = 1时,关联链路为:
- red表id=1的记录关联green表id=1的记录,取值g.enum=100
- green表id=1的记录关联blue表id=1的记录,取值b.title='abc'
- 计算blue_id=1对应的green表enum最大值:MAX(100,101,102)=102
最终输出完全匹配预期:
|id| green_id | g_enum | g_enum_max | blue_title | |--| ---------|--------|------------|------------| |1 | 1 | 100 | 102 | abc |
内容的提问来源于stack exchange,提问作者Tadas V.
相关产品推荐
相关产品推荐

