where子句中的mysql重复子查询

mrwjdhj3  于 2021-06-20  发布在  Mysql
关注(0)|答案(2)|浏览(627)

我需要在一个查询中选择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子句中有一些重复的子查询(它只是查询的一部分,这个子查询重复了很多次)

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

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

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

并使type\u id、type2\u id在所有查询上下文中可用。
我知道MySQL8.0有很多语法,但我使用的是5.7.22
我想在一个没有事务的查询中实现这一点。

pgccezyw

pgccezyw1#

你很难给出完整的建议而不看到你更多的疑问。但你有一些选择。
您可以尝试创建一个视图,如下所示,然后使用它。

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
68bkxrlz

68bkxrlz2#

试试这个

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   
                    ...
             )

相关问题