MySQL 5.6查询:获取未关联table2的记录及最新拒绝记录
MySQL 查询实现方案
背景说明
现有两张关联表 table1 和 table2,其中 table1.id 与 table2.lead_id 为关联字段。两张表的结构及数据如下:
table1 结构与数据
| id | loan_id | status |
|---|---|---|
| 1 | 100 | valid |
| 2 | 101 | valid |
| 3 | 102 | valid |
| 4 | 103 | valid |
table2 结构与数据
| id | lead_id | lead_status | created |
|---|---|---|---|
| 1 | 1 | REJECTED | 01/01/2023 |
| 2 | 2 | REJECTED | 01/01/2023 |
| 3 | 3 | REJECTED | 01/01/2023 |
| 4 | 1 | REJECTED | 10/01/2023 |
| 5 | 2 | REJECTED | 10/01/2023 |
| 6 | 3 | REJECTED | 10/01/2023 |
需求目标
编写 MySQL 查询语句,输出以下内容:
table1中无对应table2记录的loan_id(即table1.id未出现在table2.lead_id中的条目)table2中每个lead_id对应的最新一条REJECTED记录的loan_id(关联table1获取)和created时间
预期输出
| loan_id | created |
|---|---|
| 101 | 10/01/2023 |
| 102 | 10/01/2023 |
| 103 | 10/01/2023 |
| 104 | null |
注:预期结果中的
104未在原table1数据中出现,推测为输入笔误,实际执行以下语句将返回table1所有loan_id,无对应table2记录的created字段为null。
实现语句
方法一:子查询分组获取最新记录(兼容低版本 MySQL)
SELECT t1.loan_id, t2_latest.created FROM table1 t1 LEFT JOIN ( SELECT lead_id, created FROM table2 WHERE lead_status = 'REJECTED' AND (lead_id, created) IN ( SELECT lead_id, MAX(created) FROM table2 WHERE lead_status = 'REJECTED' GROUP BY lead_id ) ) t2_latest ON t1.id = t2_latest.lead_id;
方法二:窗口函数(MySQL 8.0+ 推荐)
利用 ROW_NUMBER() 窗口函数直接标记每个 lead_id 的最新记录,写法更简洁高效:
SELECT t1.loan_id, t2_filtered.created FROM table1 t1 LEFT JOIN ( SELECT lead_id, created, ROW_NUMBER() OVER (PARTITION BY lead_id ORDER BY created DESC) AS rn FROM table2 WHERE lead_status = 'REJECTED' ) t2_filtered ON t1.id = t2_filtered.lead_id AND t2_filtered.rn = 1;
内容的提问来源于stack exchange,提问作者Souvik Kumar Paul
相关产品推荐
相关产品推荐

