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

MySQL LEFT JOIN右表多匹配:如何仅返回距今日最近的随访日期记录

解决方案

方法一:使用窗口函数(MySQL 8.0+推荐)

利用ROW_NUMBER()窗口函数按客户分组,对followup日期倒序排序,取每组第一条记录,既能保留无扫描记录的客户,又能拿到每个客户最近的扫描日期。

SELECT c.*, s.followup
FROM clients c
LEFT JOIN (
    SELECT 
        client_id, 
        followup,
        ROW_NUMBER() OVER (PARTITION BY client_id ORDER BY followup DESC) AS rn
    FROM scans
) s ON c.id = s.client_id AND s.rn = 1;

子查询中给每个客户的扫描记录按followup降序排号,最近的日期排第1。左连接时仅关联rn=1的记录,无扫描记录的客户会被保留,followup字段为NULL。

方法二:适用于MySQL 5.x版本

若MySQL版本不支持窗口函数,可通过子查询找到每个客户的最新followup日期,再关联回scans表:

SELECT c.*, s.followup
FROM clients c
LEFT JOIN scans s ON c.id = s.client_id
AND s.followup = (
    SELECT MAX(followup) 
    FROM scans 
    WHERE client_id = c.id
);

子查询获取每个客户的最新followup日期,左连接时仅匹配该日期的记录。无扫描记录的客户,子查询返回NULL,s.followup也为NULL,不会排除左表客户。

注意:若同一客户同一天有多条扫描记录,此方法会返回多条相同日期的记录。需确保每个客户仅返回一条的话,可结合主键去重:

SELECT c.*, s.followup
FROM clients c
LEFT JOIN scans s ON c.id = s.client_id
AND s.id = (
    SELECT id 
    FROM scans 
    WHERE client_id = c.id 
    ORDER BY followup DESC 
    LIMIT 1
);

内容的提问来源于stack exchange,提问作者Ivan Vasquez

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 18:35:24