使用一个查询的结果来进行另一个查询的SQL语句

14

这是一个表格的摘录:

| id | type    | other_id | def_id | ref_def_id|
| 1  | int     | NULL     |  5     | NULL     |
| 2  | string  | NULL     |  5     | NULL     |
| 3  | int     | NULL     |  5     | NULL     |
| 20 | ref     | 3        |  NULL  | 5        |
| 21 | ref     | 4        |  NULL  | 5        | 
| 22 | ref     | 5        |  NULL  | 5        |  

我想要的是找到类型为ref的条目。例如,我的结果中会有这个条目:

| 22 | ref     | 5        |  NULL  | 5        |  
我面临的问题是我现在想将此条目与表中其他def_id = 5的条目合并。 因此,我会得到所有具有特定ref类型的 def_id = 5 的条目作为结果。 我需要从第一个查询中获取输出,检查ref_def_id是什么,然后为此ID进行另一个查询。
我真的很难理解如何继续下去。非常感谢任何输入。
4个回答

12

如果我理解正确,您需要查找具有“ref”类型的type行,然后使用它们ref_def_id列中的值来获取具有相同值的def_id行。在这种情况下,您需要使用子查询获取具有“ref”类型的行,并使用INEXISTS进行组合:

select *
from YourTable
where def_id in (select ref_def_id from YourTable where type='ref');

select *
from YourTable
where exists (select * from YourTable yt
  where yt.ref_def_id=YourTable.def_id and yt.type='ref')

两个查询语句是相等的,IN更容易初次理解,但EXISTS允许更复杂的条件(例如,您可以使用多个列与子查询组合)。

编辑:由于您评论说您还需要从“ref”行中获取id,所以您需要使用子查询:

select source_id, YourTable.*
from YourTable
join (select id as source_id, ref_def_id
      from YourTable
      where type='ref')
as refs on refs.ref_def_id=YourTable.def_id
order by source_id, id;

对于每一行具有 'ref' 的数据,您将获得与关联的ref_id相关的所有行。


非常感谢,这对我帮助很大。现在我看到另一个问题。是否有可能跟踪条目属于哪种类型?例如,如果我想查看id 20、type ref、other_id 3的所有相关信息。查询完美地工作了,但我注意到需要跟踪。现在我得到了所有参考的查询结果,而我看不到它们属于哪个初始id。我的解释清楚吗?如果您有任何解决方案,请帮忙。 - curlie
我认为我明白了,您想要从获取 ref_def_id 的行中获取 id,但问题是使用您的示例数据,您将获得许多组合。我的意思是,由于该列中有重复值,因此每个 def_id 值都会获得 (重复的 ref_def_id 计数) x (重复的 def_id 计数) 行。例如,对于 ref_def_id=5,您将获得 9 个结果行,即,*(3行具有 def_id=5) x (3行具有 ref_def_id=5)*。这就是您想要的吗? - Alberto Martinez
是的,它朝这个方向发展。例如,当我查询id为20时,应该返回3行,因为值是ref,ref_def_id为5,并且有3行def_id的值为5。你可以想象ref_def_id是对def_id的引用,因此当我进行查询时,其中ref_def_id不为空,总是存在对这个def_id列的引用。这就是我遇到的问题... - curlie
非常感谢。这正是我在寻找的。你能帮助我真是太好了。我可以问你最后一个问题吗?很高兴source_id现在在列表中有追踪。从我上面的例子中,如果我还想在最终列表中保留other_id列,该如何扩展你的代码示例?我尝试做与source_id相同的操作,但新列只有NULL条目。 - curlie
如果你在子查询中得到了空值,只需将 other_id 放入子查询中,例如 other_id as source_other_id。如果你仍然得到空值,那么可能是该列本身就为空,或者你在 select 语句中使用的是主表中的列而不是子查询中的列(当你不确定时,只需执行子查询部分以查看发生了什么)。 - Alberto Martinez
非常感谢你的帮助!它对我帮助很大。 - curlie

2
使用以下查询语句从子查询中获取列。
select a.ref_def_id
from (select ref_def_id from YourTable where type='ref') as a;

0
你需要的是子查询或者更好的联接操作。
可以看一下这里:http://www.mysqltutorial.org/mysql-left-join.aspx 联接/左联接允许你在一个查询中根据给定条件组合表格行。对于你的目的,条件可以是id = 5。

0

你似乎想要聚合:

select max(id) as id, type, max(other_id) as other_id,
       max(def_id) as def_id, ref_def_id
from t
where type = 'ref'
group by type, ref_def_id

关于上述内容,当我尝试执行此查询时,我收到错误响应,指出存在未知列 ref。有什么想法吗? - curlie
@curlie...在“group by”中应该使用“type”。 - Gordon Linoff

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接