惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

V
V2EX
C
Check Point Blog
博客园_首页
B
Blog
D
Docker
U
Unit 42
量子位
I
InfoQ
有赞技术团队
有赞技术团队
Martin Fowler
Martin Fowler
GbyAI
GbyAI
L
LangChain Blog
云风的 BLOG
云风的 BLOG
博客园 - Franky
美团技术团队
T
The Blog of Author Tim Ferriss
阮一峰的网络日志
阮一峰的网络日志
月光博客
月光博客
Vercel News
Vercel News
Recent Announcements
Recent Announcements
雷峰网
雷峰网
大猫的无限游戏
大猫的无限游戏
小众软件
小众软件
Google DeepMind News
Google DeepMind News

Hsu Yeung 的博客

三圣花市 | Hsu Yeung 的博客 网站支持 Live Photo 图片展示 | Hsu Yeung 的博客 梦 | Hsu Yeung 的博客 周末午餐 | Hsu Yeung 的博客 张家界 | Hsu Yeung 的博客 话剧《寻她芳踪·张爱玲》 | Hsu Yeung 的博客 博客自动生成文章目录 | Hsu Yeung 的博客 灭螂行动! | Hsu Yeung 的博客 张靓颖成都演唱会 | Hsu Yeung 的博客 最近对博客做的一些微调总结 | Hsu Yeung 的博客 Windows 上安装 Lua | Hsu Yeung 的博客 网站支持展示 B 站 iframe 视频 SpringBoot 中使用 RedisTemplate 存取整数值的坑 | Hsu Yeung 的博客 SQL JOIN 中 ON 与 WHERE 的区别 值得记录的一些工作近况 | Hsu Yeung 的博客 周传雄成都演唱会 | Hsu Yeung 的博客 并行操作导致获取数据库连接超时 | Hsu Yeung 的博客 风信子 | Hsu Yeung 的博客 Linux 安装并配置 Nginx | Hsu Yeung 的博客 使用 logrotate 切割 nginx 日志 郁金香土培结果 | Hsu Yeung 的博客 获取数据库锁等待超时问题 | Hsu Yeung 的博客 从零开始挑选相机 | Hsu Yeung 的博客 郁金香 | Hsu Yeung 的博客 我的第一束花 | Hsu Yeung 的博客 快乐的一周 | Hsu Yeung 的博客 重庆,来了 | Hsu Yeung 的博客 散步 | Hsu Yeung 的博客 Git 工作区、暂存区、版本库之间的关系 | Hsu Yeung 的博客 Collectors.toMap() 操作 value 为 null 的情况
MySQL LEFT JOIN 右表有多条数据但只取最新的一条 | Hsu Yeun...
2024-03-29 · via Hsu Yeung 的博客

原 SQL:

-- 简单说明:t1 表是单据表,t2 表是审核记录表
-- t2.type = 2 表示复审、t2.object_id 存的就是单据 id,t2.result = 1 表示审核通过
-- 需求:查询单据信息的同时查出该单据复审通过的时间
SELECT t1.id          AS id,
       t1.bill_no     AS billNo,
       t1.submit_time AS submitTime,
       t2.audit_time  AS reviewAuditTime
FROM order_bill_info AS t1
         LEFT JOIN sys_audit_record AS t2
                   ON t2.object_id = t1.id
                       AND t2.type = 2
                       AND t2.result = 1
                       AND t2.is_deleted = 0
WHERE t1.is_deleted = 0
  AND t1.bill_no = 'DC202308030026'
ORDER BY submitTime DESC

一开始负责人说单据审核通过的记录只会有一条,不存在多条审核通过的记录,那么上面的 SQL 是完全 OK 的。但是实际测试一轮下来发现我这边查询结果里有重复数据,去数据库看了数据后发现审核通过的记录有多条,找人一问才知道,单据审核被驳回后还可以重新走审核流程,并且以前的审核通过记录还保留着的,导致我这边关联查询审核信息时就出现重复数据了,沟通一番后,最终让我暂时先取最新的一条审核记录,于是就只有在关联条件上再增加一个关联子查询,这个子查询的作用就是找到满足关联条件的数据中“最新”的数据。

改写后的 SQL:

SELECT t1.id          AS id,
       t1.bill_no     AS billNo,
       t1.submit_time AS submitTime,
       t2.audit_time  AS reviewAuditTime
FROM order_bill_info AS t1
         LEFT JOIN sys_audit_record AS t2
                   ON t2.object_id = t1.id
                       AND t2.type = 2
                       AND t2.result = 1
                       AND t2.is_deleted = 0
-- 上面都是正常的关联条件,后面这个 AND 条件就是为了筛选出“最新”的一条数据
                       AND t2.id =
                           (SELECT MAX(id)
                            FROM sys_audit_record
                            WHERE type = 2
                              AND result = 1
                              AND object_id = t1.id
                              AND is_deleted = 0)
WHERE t1.is_deleted = 0
  AND t1.bill_no = 'DC202308030026'
ORDER BY submitTime DESC