mysql - 在内部连接中重用 mysql 子查询

标签 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 是否对这种类型的查询进行某种缓存?

最佳答案

您问题的直接答案是“否”。 MySQL 不支持你想要的。您真正需要的是 with 语句。伟大的声明!如果需要,请使用不同的数据库。唉。

我确实认为你可以做到这一点,尽管方法与你正在做的完全不同。

逻辑是从复杂查询中获取 myposter 的所有值,并从 profiles_old 中获取 myposter 的所有值,其中相应的 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;

剩下的只是将其合并到您的整体查询中。

关于mysql - 在内部连接中重用 mysql 子查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19825615/

相关文章:

php - 如何使用 laravel Raw 查询选择行

mysql 分配给任务的人数

mysql - 根据 SQL 中的组过滤掉重复项

php - 两个查询与一个查询,性能

java - Java 中的 Lambda 与迭代器

PHP OOP 登录/注册系统

mysql - sails.js 查询表列内的 json 对象

sql - 查找员工姓名,姓名相同但工资不同

sql-server - SQL内存-查看实际使用的内存和可用内存

php - 消息的Mysql数据库查询拉取未读消息的数量(带查询)