MySQL实现Left Join仅匹配首条数据且保留主表全部行
实现Left Join并仅保留同一id首行的关联数据
问题分析
需要保留table_1的所有行,但对同一id仅在第一条匹配行显示table_2的service_date,其余同id行的该字段设为NULL。普通Left Join会将table_2的匹配数据重复关联到table_1的同id行,无法满足需求。
解决方案
利用窗口函数ROW_NUMBER()为table_1中每个id的行分组排序,标记出每组首行,再通过条件判断仅在首行填充service_date:
SELECT t1.id, t1.month, CASE WHEN rn = 1 THEN t2.service_date ELSE NULL END AS service_date FROM ( -- 给table_1每个id下的行按month排序并编号 SELECT id, month, ROW_NUMBER() OVER (PARTITION BY id ORDER BY month) AS rn FROM table_1 ) t1 LEFT JOIN table_2 t2 ON t1.id = t2._id; -- 注意table_2的关联字段是_id
逻辑说明
- 子查询中,
PARTITION BY id将table_1按id分组,ORDER BY month确定每组内的行顺序(保证首行符合你的预期,比如按月份先后),ROW_NUMBER()为每组内的行生成从1开始的序号。 - 主查询通过
LEFT JOIN关联table_2,再用CASE语句判断:仅当行序号rn=1时,取table_2的service_date,否则设为NULL。 - 该方式既完整保留了
table_1的所有行,又严格控制了service_date的显示逻辑。
内容的提问来源于stack exchange,提问作者Scott Johnson
相关产品推荐
相关产品推荐

