Mysql 对多个表使用NOT IN语句的简化方法

Mysql 对多个表使用NOT IN语句的简化方法,mysql,sql,database,Mysql,Sql,Database,如何简化此查询?不幸的是,这不起作用 $Query = mysqli_query($conn, "SELECT * FROM order_number where trans_id NOT IN (SELECT order_no from billing) AND NOT IN(SELECT order_no from pending) AN

如何简化此查询?不幸的是,这不起作用

$Query = mysqli_query($conn, "SELECT * FROM order_number where trans_id NOT IN (SELECT order_no from billing)
                                       AND NOT IN(SELECT order_no from pending)
                                       AND NOT IN(SELECT order_no from on_process)
                                       AND NOT IN(SELECT order_no from finished)");
还有别的办法吗?我正在尝试打印trans_id行,如果它不在计费、挂起、在_进程中且已完成

SELECT * FROM order_number 
where trans_id NOT IN 
(
   SELECT order_no from billing
   union 
   SELECT order_no from pending
   union 
   SELECT order_no from on_process
   union
   SELECT order_no from finished
)
或者当你尝试的时候

SELECT * FROM order_number 
where trans_id NOT IN (SELECT order_no from billing)
  AND trans_id NOT IN (SELECT order_no from pending)
  AND trans_id NOT IN (SELECT order_no from on_process)
  AND trans_id NOT IN (SELECT order_no from finished)
或者当你尝试的时候

SELECT * FROM order_number 
where trans_id NOT IN (SELECT order_no from billing)
  AND trans_id NOT IN (SELECT order_no from pending)
  AND trans_id NOT IN (SELECT order_no from on_process)
  AND trans_id NOT IN (SELECT order_no from finished)
或者当你尝试的时候

SELECT * FROM order_number 
where trans_id NOT IN (SELECT order_no from billing)
  AND trans_id NOT IN (SELECT order_no from pending)
  AND trans_id NOT IN (SELECT order_no from on_process)
  AND trans_id NOT IN (SELECT order_no from finished)
或者当你尝试的时候

SELECT * FROM order_number 
where trans_id NOT IN (SELECT order_no from billing)
  AND trans_id NOT IN (SELECT order_no from pending)
  AND trans_id NOT IN (SELECT order_no from on_process)
  AND trans_id NOT IN (SELECT order_no from finished)

您可以在表上进行左联接,并筛选出没有匹配记录的记录:

select
  n.*
from
  order_number n
  left join billing b on b.order_no = n.trans_id
  left join pending p on p.order_no = n.trans_id
  left join on_process o on o.order_no = n.trans_id
  left join finished f on f.order_no = n.trans_id
where
  b.order_no is null and
  p.order_no is null and
  o.order_no is null and
  f.order_no is null

您可以在表上进行左联接,并筛选出没有匹配记录的记录:

select
  n.*
from
  order_number n
  left join billing b on b.order_no = n.trans_id
  left join pending p on p.order_no = n.trans_id
  left join on_process o on o.order_no = n.trans_id
  left join finished f on f.order_no = n.trans_id
where
  b.order_no is null and
  p.order_no is null and
  o.order_no is null and
  f.order_no is null

您可以在表上进行左联接,并筛选出没有匹配记录的记录:

select
  n.*
from
  order_number n
  left join billing b on b.order_no = n.trans_id
  left join pending p on p.order_no = n.trans_id
  left join on_process o on o.order_no = n.trans_id
  left join finished f on f.order_no = n.trans_id
where
  b.order_no is null and
  p.order_no is null and
  o.order_no is null and
  f.order_no is null

您可以在表上进行左联接,并筛选出没有匹配记录的记录:

select
  n.*
from
  order_number n
  left join billing b on b.order_no = n.trans_id
  left join pending p on p.order_no = n.trans_id
  left join on_process o on o.order_no = n.trans_id
  left join finished f on f.order_no = n.trans_id
where
  b.order_no is null and
  p.order_no is null and
  o.order_no is null and
  f.order_no is null
没有理由“简化”查询。如果在四个子查询中的表上有适当的索引,它应该是非常有效的。如果任何表中的
orderno
可能为
NULL
,那么我建议使用
notexists

SELECT *
FROM order_number  o
WHERE NOT EXISTS (select order_no from billing where b.order_no = o.trans_id) AND
      NOT EXISTS (select order_no from pending p where p.order_no = o.trans_id) AND
      NOT EXISTS (select order_no from on_process op where op.order_no = o.trans_id) AND
      NOT EXISTS (select order_no from finished f where f.order_no = o.trans_id);
正确的索引是:
计费(订单号)
挂起(订单号)
完成(订单号)
,以及
关于流程(订单号)
,没有理由“简化”查询。如果在四个子查询中的表上有适当的索引,它应该是非常有效的。如果任何表中的
orderno
可能为
NULL
,那么我建议使用
notexists

SELECT *
FROM order_number  o
WHERE NOT EXISTS (select order_no from billing where b.order_no = o.trans_id) AND
      NOT EXISTS (select order_no from pending p where p.order_no = o.trans_id) AND
      NOT EXISTS (select order_no from on_process op where op.order_no = o.trans_id) AND
      NOT EXISTS (select order_no from finished f where f.order_no = o.trans_id);
正确的索引是:
计费(订单号)
挂起(订单号)
完成(订单号)
,以及
关于流程(订单号)
,没有理由“简化”查询。如果在四个子查询中的表上有适当的索引,它应该是非常有效的。如果任何表中的
orderno
可能为
NULL
,那么我建议使用
notexists

SELECT *
FROM order_number  o
WHERE NOT EXISTS (select order_no from billing where b.order_no = o.trans_id) AND
      NOT EXISTS (select order_no from pending p where p.order_no = o.trans_id) AND
      NOT EXISTS (select order_no from on_process op where op.order_no = o.trans_id) AND
      NOT EXISTS (select order_no from finished f where f.order_no = o.trans_id);
正确的索引是:
计费(订单号)
挂起(订单号)
完成(订单号)
,以及
关于流程(订单号)
,没有理由“简化”查询。如果在四个子查询中的表上有适当的索引,它应该是非常有效的。如果任何表中的
orderno
可能为
NULL
,那么我建议使用
notexists

SELECT *
FROM order_number  o
WHERE NOT EXISTS (select order_no from billing where b.order_no = o.trans_id) AND
      NOT EXISTS (select order_no from pending p where p.order_no = o.trans_id) AND
      NOT EXISTS (select order_no from on_process op where op.order_no = o.trans_id) AND
      NOT EXISTS (select order_no from finished f where f.order_no = o.trans_id);

正确的索引是:
计费(订单号)
挂起(订单号)
完成(订单号)
,以及
关于流程(订单号)

@phenomenon09记住接受或发布您自己的解决方案作为答案,我建议不存在而不是不存在,因为这可能是OP想要的。(子选择中为空…)如果您关心性能,请不要在子查询中使用带有
union
的版本。@现象09请记住接受或发布您自己的解决方案作为答案,我建议不存在而不是不存在,因为这可能是OP想要的。(子选择中为空…)如果您关心性能,请不要在子查询中使用带有
union
的版本。@现象09请记住接受或发布您自己的解决方案作为答案,我建议不存在而不是不存在,因为这可能是OP想要的。(子选择中为空…)如果您关心性能,请不要在子查询中使用带有
union
的版本。@现象09请记住接受或发布您自己的解决方案作为答案,我建议不存在而不是不存在,因为这可能是OP想要的。(子选项中的空值…)如果您关心iota的性能,请不要在子查询中使用带有
union
的版本。是否有特定原因导致账单、挂起、正在处理和已完成不是订单表中的状态?是否有特定原因导致账单、挂起、,on_process和finished不是订单表中的状态?是否有特定原因说明billing、pending、on_process和finished不是订单表中的状态?是否有特定原因说明billing、pending、on_process和finished不是订单表中的状态?