mysql在where子句中重复子查询

时间:2018-06-07 10:17:52

标签: mysql subquery

我需要在一个查询中从mysql 5.7.22中进行选择。

select id from t1 where type_id=(select type_id from t2 where id=1 limit 1) and id not in  
            (select obj_id from t2
                where 
                    type_id = (select type_id from t2 where id=1 limit 1)
                    and
                    type2_id = (select type2_id from t2 where id=1 limit  
                    ...
             ) 

我在where子句中有一些重复的subquerys(它只是查询的一部分,这个子查询重复多次)

'(select type_id from t2 where id=1 limit 1)'

我可以在一个地方弄清楚,以减少冗长。 所以我想选择一次

select type_id, type2_id from t2 where id=1 limit 1

并在所有查询上下文中使type_id,type2_id可用。

我知道mysql 8.0有WITH语法,但我使用的是5.7.22

我想在没有交易的一个查询中执行

2 个答案:

答案 0 :(得分:1)

如果不了解您的更多查询,很难向您提供完整的建议。但是你有一些选择。

您可以尝试创建一个视图,然后使用它。

CREATE VIEW selector
    AS SELECT MAX(type_id) type_id, MAX(obj_id) obj_id
         FROM t2
        WHERE id = 1

t2查询可能会返回多行。此视图使用MAX()代替LIMIT 1来处理此问题。但如果t2.id是主键,那么您只需要

CREATE VIEW selector
    AS SELECT type_id, obj_id
         FROM t2
        WHERE id = 1

然后您可以在查询中使用该视图。

例如

SELECT id
  FROM t1
 WHERE type_id = (SELECT type_id FROM selector)
   AND obj_id <> (SELECT obj_id FROM selector)

或者你可以弄清楚如何使用连接操作而不是子查询。

SELECT id
  FROM t1
  JOIN selector ON t1.type_id = selector.type_id AND t1.obj_id <> selector.obj_id

答案 1 :(得分:0)

试试这个

select id from t1 ,(select type_id from t2 where id=1 limit 1)  t where type_id=t.type_id and id not in  
            (select obj_id from t2
                where 
                    type_id = t.type_id 
                    and
                    type2_id = t.type_id   
                    ...
             ) 
相关问题