Mysql 如何简化sql语句

Mysql 如何简化sql语句,mysql,sql,Mysql,Sql,我有以下疑问: select * from main_iteminstance where master_id=33568 or tv_series_id in (select id from main_iteminstance where master_id=33568) 如何最好地简化这一点 基本上,我想得到的是: ids = select id from main_iteminstance where master_id=33568 child_ids = select id f

我有以下疑问:

select * from main_iteminstance where master_id=33568
  or tv_series_id  in 
(select id from main_iteminstance where master_id=33568)
如何最好地简化这一点

基本上,我想得到的是:

ids = select id from main_iteminstance where master_id=33568
child_ids = select id from main_iteminstance where tv_series_id in ids
my_answer = ids + child_ids

进一步查看后,子查询正在执行查找,其中主查询id与父查询的值相同。这意味着带有tv_series_id的条件是多余的,因为它只返回在父级中已经找到的结果

最简单的结果集是:

SELECT * 
FROM   main_iteminstance 
WHERE  master_id=33568
除非您正在寻找与主id匹配的电视剧id!=33568


此示例演示tv_series_id与主id匹配的位置!=33568如果不需要,您可以删除OR和后面的所有内容。

您可以使用相关子查询,如下所示:

select * 
from main_iteminstance as m
where exists (
    select *
    from main_iteminstance as s
    where (m.id = s.id or m.id = s.tv_series_id)
    and s.master_id=33568)

与您提供的查询相比,此查询的执行方式取决于很多因素,但由于所有内容都在一个位置指定,因此它更易于维护和清晰。

另一种方法是在表本身上联接表:

SELECT Master.*
FROM main_iteminstance Master
INNER JOIN main_iteminstance Child
ON Child.master_id = 33568 AND ((Master.id = Child.id) OR (Master.tv_series_id = Child.id))

不,电视连续剧的id永远不会是33568。请注意,在第二个子查询中,我从主\u iteminstance中选择了id。不,我没有做减号,我留下了一条注释,我从来没有投过反对票。@David542如果您一直在寻找master\u id=33568,则可能永远不需要与id匹配的查询tv\u series\u id的或部分。只有在master_id!=33568我已经更新了小提琴,只显示大师id不是你之前寻找的那个,但我不确定你想要的是什么。这里似乎有一个父/子关系的数据层次结构,但我不太确定master_id=33568或tv_series_id=id且master_id=33568的数据外观。这是您的第一个查询,不需要子查询,但第二个条件是多余的。显示一些具有所需结果的数据。@Mihai第二个条件可能是必需的,但仅当存在id和电视剧id不同且主控id不是33568的行,并且存在主控id为33568且id与第一行中的电视剧id相同的行时,这与执行以下操作相同:从主控项目实例中选择*主控id=33568良好点。事实上,相关子查询有时会在内部转换为这种形式。我意识到这一点是因为早期的一些DBMS产品做得不正确,这正是多年前我注意到的地方。@David542,实际上不是选择*from main_iteminstance,其中master_id=33568'是一个非常不同的查询。提问者试图做的是选择所有id或电视剧id与另一行主id为33568的行匹配的行。您的查询只返回主id为33568的行。只有当只有33568的行在所有三列中都有它们时,这才是相同的。@KenClement我想我是提问者,但AND子句只有在引用自身时才是正确的,所以在上述情况下,它可以被处理。@David542,Chris给出的查询和我给出的查询是等价的,正如我所指出的,一些DBMS会在内部将子查询版本转换为自连接版本。但是,这两者都不等同于“从mainiteminstance中选择*,其中master_id=33568”。后面的查询仅在非常特殊的情况下返回相同的结果集,而不是在一般情况下。