【问题标题】:mysql duplicate subquery in where clausemysql在where子句中重复子查询
【发布时间】:2018-11-17 05:20:18
【问题描述】:

我需要在一个查询中从 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_id、type2_id 在所有查询上下文中可用。

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

我想在一个没有事务的查询中执行此操作

【问题讨论】:

    标签: mysql subquery


    【解决方案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
    

    【讨论】:

      【解决方案2】:

      试试这个

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

      【讨论】:

        猜你喜欢
        • 2020-05-05
        • 2020-10-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-09
        • 2015-02-18
        • 1970-01-01
        相关资源
        最近更新 更多