如何选择指定行及其所有关联行?SQL查询问题求助
问题分析与解决方案
让我来帮你拆解下这个查询的问题,以及给出符合需求的写法~
为什么你的查询只返回一行?
你的语句是:
select m1.* from mytable m1 left join mytable m2 on m1.id = m2.related where m1.id = 1
核心问题在这里:where m1.id = 1直接限定了仅从m1表中选取id=1的行。虽然你做了左连接,m2表中related=1的行(也就是id=2的那行)会被关联到m1的行上,但你最终只选择了m1.*——也就是主表m1的字段,所以结果自然只有id=1的那一行,完全没涉及到m2表中的数据。
正确的查询写法
方法1:用OR条件直接筛选(最简洁)
如果你的需求就是获取id=1的行,加上所有related=1的行,最直观的写法是用WHERE条件组合:
SELECT * FROM mytable WHERE id = 1 OR related = 1;
执行这个语句就能同时返回id=1和id=2的两行,完美匹配你的需求。
方法2:用UNION合并结果(适合复杂场景)
如果后续需要针对两种情况分别做更复杂的筛选,可以用UNION把两个独立查询的结果合并:
SELECT * FROM mytable WHERE id = 1 UNION SELECT * FROM mytable WHERE related = 1;
⚠️ 注意:UNION会自动去除重复行(比如如果某行同时满足id=1和related=1),如果需要保留重复,改用UNION ALL即可。
额外说明:如果是递归层级的关联?
如果你的表是树形结构,需要获取id=1的所有子节点(包括更深层级),那就要用递归查询(比如MySQL的WITH RECURSIVE,PostgreSQL的递归CTE),但从你给出的数据来看,目前只是两层关联,上面的两种方法就足够啦。
内容的提问来源于stack exchange,提问作者Martin AJ
相关产品推荐
相关产品推荐

