where子句中的mysql重复子查询
我需要在一个查询中选择mysql 5.7.22where子句中的mysql重复子查询,mysql,subquery,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)
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在所有查询上下文中可用
我知道mysql 8.0有语法,但我使用的是5.7.22
我想在一个查询中完成这项工作,而不进行事务处理。如果不查看查询的更多内容,就很难给出完整的建议。但是你有一些选择 您可以尝试创建一个视图,如下所示,然后使用它
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
试试这个
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
...
)