已知外键列时,如何从数据库表中查询目标关联行?
查询父级名称为'foo'的子行解决方案
针对你提供的foo_bar表结构和需求,这里有两种常用的SQL查询方法,都能返回父级名称为'foo'的bar和sql对应的行:
方法一:自连接查询
这是处理同表父子关联最常用的方式,把表本身当作两个独立的表(父表和子表)进行关联:
SELECT child_tb.* FROM foo_bar child_tb JOIN foo_bar parent_tb ON child_tb.parent = parent_tb.id WHERE parent_tb.name = 'foo';
逻辑说明:
- 我们给
foo_bar表起了两个别名:child_tb代表需要查询的子行,parent_tb代表对应的父行 - 通过
child_tb.parent = parent_tb.id关联子行和它的父行 - 用
WHERE parent_tb.name = 'foo'过滤出父级名称为'foo'的子行 - 最终返回子行的所有字段,也就是你预期的
bar和sql两行
方法二:子查询
如果逻辑更简单,也可以先用子查询找到父级名称为'foo'的id,再匹配子行的parent字段:
-- 当父级名称唯一时用= SELECT * FROM foo_bar WHERE parent = (SELECT id FROM foo_bar WHERE name = 'foo'); -- 如果存在多个名称为'foo'的父行,改用IN SELECT * FROM foo_bar WHERE parent IN (SELECT id FROM foo_bar WHERE name = 'foo');
逻辑说明:
- 内层的子查询
SELECT id FROM foo_bar WHERE name = 'foo'会先得到父级'foo'的id(也就是1) - 外层查询再筛选
parent等于这个id的所有行,就能得到目标子行
两种方法都能满足你的需求,你可以根据实际场景选择:如果需要同时展示父级和子级的信息,自连接会更灵活;如果只是简单匹配父级id,子查询更直观。
内容的提问来源于stack exchange,提问作者Vincensius
相关产品推荐
相关产品推荐

