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
相关产品推荐
相关产品推荐

