MySQL中如何根据ID查询自身及同表ID_REF关联行
解决MySQL中查询行及其关联ID_REF行的问题
针对你的需求,我们可以用UNION(或UNION ALL)来轻松实现同时查询目标行和它关联的ID_REF行,下面给你两种实用的方案:
方案一:使用UNION分步查询
这种方法逻辑很直观——先查询目标ID的行,再查询其ID_REF对应的行(如果ID_REF不为空),最后合并结果:
SELECT ID, ID_REF FROM your_table -- 替换成你的实际表名 WHERE ID = 2 -- 替换成你要查询的ID值 UNION ALL -- 用UNION ALL比UNION效率更高,因为不会去重(这里ID唯一,不会有重复) SELECT ID, ID_REF FROM your_table WHERE ID = (SELECT ID_REF FROM your_table WHERE ID = 2) AND ID_REF IS NOT NULL; -- 避免ID_REF为null时子查询返回null导致匹配错误
效果说明:
- 当查询ID=2时:第一个
SELECT返回ID=2、ID_REF=3的行;第二个SELECT通过子查询拿到ID_REF=3,再返回ID=3、ID_REF=null的行,最终结果是两行数据。 - 当查询ID=1时:第二个
SELECT的子查询得到null,WHERE ID = null不会匹配任何行,所以只返回ID=1的那一行。
方案二:用IN子句构造查询集合
如果你喜欢更紧凑的写法,可以先构造一个包含目标ID和关联ID的集合,再一次性查询:
SELECT ID, ID_REF FROM your_table WHERE ID IN ( -- 先取目标ID SELECT ID FROM your_table WHERE ID = 2 -- 再取关联的ID_REF(仅当ID_REF不为空时) UNION SELECT ID_REF FROM your_table WHERE ID = 2 AND ID_REF IS NOT NULL );
这个方案和方案一效果完全一样,只是写法更简洁,适合追求代码紧凑的场景。
注意事项:
- 记得把
your_table替换成你实际使用的表名。 - 如果你的ID是主键(唯一标识),那么子查询只会返回0或1行,不会出现多匹配的问题。
内容的提问来源于stack exchange,提问作者afjm
相关产品推荐
相关产品推荐

