我正在尝试优化一个查询,试图避免重复使用“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/