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

如何解决带多表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时,关联链路为:

  1. red表id=1的记录关联green表id=1的记录,取值g.enum=100
  2. green表id=1的记录关联blue表id=1的记录,取值b.title='abc'
  3. 计算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.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.30 18:15:09