MySQL多表左连接:获取最小日期及对应创建人问题求助
解决MySQL LEFT JOIN中获取最小日期对应记录及计算响应分钟数的问题
你的问题核心在于直接在主查询中使用聚合函数MIN()但没有正确分组,同时关联Users表时会因为Transactions的多条记录导致结果混乱。我们需要先精准定位每个Ticket对应的最早Correspond类型Transaction,再关联其他表完成计算。
修改后的查询语句
SELECT t.EffectiveId, t.Created AS 'Ticket Created', o.Content, tr_min.Min_Correspond_Date AS 'Min Correspond', u.Realname, -- 按规则计算响应分钟数 CASE WHEN o.Content IS NULL THEN GREATEST(TIMESTAMPDIFF(MINUTE, t.Created, tr_min.Min_Correspond_Date), 0) ELSE GREATEST(TIMESTAMPDIFF(MINUTE, t.Created, o.Content), 0) END AS 'Computed Minutes' FROM Tickets AS t LEFT JOIN ( -- 子查询:获取每个Ticket对应的最早Correspond Transaction的日期和Creator SELECT ObjectId, Created AS Min_Correspond_Date, Creator FROM ( SELECT ObjectId, Created, Creator, -- 按ObjectId分组,按Created升序排序,标记第一条(最早)记录 ROW_NUMBER() OVER (PARTITION BY ObjectId ORDER BY Created ASC) AS rn FROM Transactions WHERE Type = 'Correspond' ) AS ranked_tr WHERE rn = 1 ) AS tr_min ON tr_min.ObjectId = t.EffectiveId LEFT JOIN ObjectCustomFieldValues o ON o.ObjectId = t.EffectiveId LEFT JOIN Users u ON u.id = tr_min.Creator WHERE t.IsMerged IS NULL;
关键步骤说明
精准获取最早Transaction记录
- 内层子查询用
ROW_NUMBER()窗口函数,按ObjectId(关联Ticket的EffectiveId)分组,对每个分组内的Created日期升序排序,标记第一条记录(rn=1),这样就能拿到每个Ticket对应的最早CorrespondTransaction的日期和创建人ID。 - 这种方式比直接用
MIN()聚合更可靠,因为它能同时锁定最小日期对应的Creator字段,避免聚合后关联错误的用户信息。
- 内层子查询用
简化响应分钟数计算
- 用
GREATEST()函数替代嵌套CASE,直接将计算结果和0比较,取较大值,这样代码更简洁,逻辑清晰:如果分钟差为负,取0,否则取计算值。
- 用
关联用户表
- 基于子查询拿到的
CreatorID关联Users表,确保拿到的是最早Transaction对应的创建人姓名。
- 基于子查询拿到的
执行结果验证
运行上述语句后,会得到你期望的结果:
| EffectiveId | Ticket Created | Content | Min Correspond | Realname | Computed Minutes |
|---|---|---|---|---|---|
| 549837 | 2018-04-02 12:03:23 | 2018-04-02 08:35:22 | 2018-04-05 08:35:22 | Grover | 12485 |
| 612302 | 2018-04-02 09:46:29 | 2018-04-02 01:02:22 | 2018-04-06 01:02:22 | Jane | 557687 |
| 616982 | 2018-04-02 09:33:24 | NULL | 2018-05-03 09:33:24 | Kade | 668878 |
内容的提问来源于stack exchange,提问作者Karen
相关产品推荐
相关产品推荐

