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

推荐订阅源

H
Help Net Security
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
博客园 - 【当耐特】
Microsoft Azure Blog
Microsoft Azure Blog
Google DeepMind News
Google DeepMind News
Apple Machine Learning Research
Apple Machine Learning Research
有赞技术团队
有赞技术团队
Y
Y Combinator Blog
H
Hackread – Cybersecurity News, Data Breaches, AI and More
爱范儿
爱范儿
L
LangChain Blog
IT之家
IT之家
酷 壳 – CoolShell
酷 壳 – CoolShell
MongoDB | Blog
MongoDB | Blog
Hugging Face - Blog
Hugging Face - Blog
G
Google Developers Blog
T
Tailwind CSS Blog
Engineering at Meta
Engineering at Meta
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
宝玉的分享
宝玉的分享
博客园 - 三生石上(FineUI控件)
D
DataBreaches.Net
Recent Announcements
Recent Announcements
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More

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