在Inner Join中重用mysql子查询

时间:2013-11-07 00:17:39

标签: mysql sql performance database-performance query-performance

我正在尝试优化查询,尝试避免重复使用“ COMPLEX QUERY ”指示的查询,该查询使用2次,两者都有相同的结果。

原始查询

SELECT news.* 
FROM   news 
   INNER JOIN((SELECT myposter 
               FROM   (SELECT **COMPLEX QUERY**)) 
              UNION 
              (SELECT myposter 
               FROM   `profiles_old` prof2 
               WHERE  prof2.profile_id NOT IN (SELECT **COMPLEX QUERY**))) r 
           ON news.profile = r.p 

我想知道这样的事情是否可行:

SELECT news.* 
FROM   (SELECT **COMPLEX QUERY**) complexQuery, 
   news 
   INNER JOIN ((SELECT myposter 
                FROM   complexquery) 
               UNION 
               (SELECT myposter 
                FROM   `profiles_old` prof2 
                WHERE  prof2. profile NOT IN (SELECT myposter 
                                              FROM complexQuery))) r 
           ON news. profile = r.p 

Mysql是否对这种类型的查询进行某种缓存?

2 个答案:

答案 0 :(得分:2)

你问题的直接答案是“不”。 MySQL不支持你想要的东西。你真正想要的是with声明。很棒的声明!如果需要,请使用其他数据库。唉。

我确实认为你可以这样做,虽然这种做法与你正在做的完全不同。

逻辑是从复杂查询中获取myposter的所有值,并从myposter获取profiles_old的所有值,其中相应的profile_id不在复杂的union all中查询。

您可以使用select (case when max(which = 'cq') = 1 then myposter when max(which = 'po') = 1 and max(which = 'cq') = 0 then id2 ) as myposter from (select myposter, myposter as id2, 'cq' as which from (select **complex query**) cq union all select profile_id, myposter, 'po' as which from profiles_old ) t group by myposter; 和聚合执行此操作。只关注内部子查询:

{{1}}

其余的只是将其整合到您的整体查询中。

答案 1 :(得分:0)

我已经完成了要求,以不同的方式提出建议:

/ * 创建临时表(首选使用内存存储引擎,虽然它不是必需的): * /

MYSQL>创建临时表tmp_intermediate_table engine = memory select COMPLEX QUERY ;

然后,在您的查询中引用tmp_intermediate_table表,该表在当前用户会话中运行。