如何在MySQL LEFT JOIN时保留主表的原始行?
如何在LEFT JOIN其他表时保留主表的根行?
要实现保留主表原始根行+关联表匹配行的效果,直接用UNION ALL把主表的基础行和LEFT JOIN的结果合并就行,具体写法如下:
解决方案:UNION ALL合并主表行与关联结果
核心就是先单独取出主表的行(关联表字段设为NULL),再把它和原LEFT JOIN的结果拼起来,这样既能保留主表的根行,又能拿到所有关联匹配的行。
完整SQL语句
-- 取出主表的根行,关联表字段设为NULL SELECT table1.id, table1.column1, NULL AS table_id, NULL AS column2 FROM table1 UNION ALL -- 执行LEFT JOIN获取关联后的行,过滤掉主表无匹配时的NULL行(避免重复) SELECT table1.id, table1.column1, table2.table_id, table2.column2 FROM table1 LEFT JOIN table2 ON table1.id = table2.table_id WHERE table2.table_id IS NOT NULL;
执行结果
运行上面的语句后,就能得到你想要的结果:
| ID | Column 1 | table_id | Column 2 |
|---|---|---|---|
| 1 | Foo | null | null(该行需保留,因为这是父行) |
| 1 | Foo | 1 | Foo bar |
| 1 | Foo | 1 | John Doe |
原查询的问题
你原来的LEFT JOIN语句,只有当主表没有匹配的关联数据时,才会返回主表行+NULL的结果。一旦主表有匹配的关联数据,LEFT JOIN只会返回主表行和关联表行的组合,不会单独保留主表的原始根行,这就是为什么得不到预期结果的原因。
内容的提问来源于stack exchange,提问作者Forbidden
相关产品推荐
相关产品推荐

