4

「 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 はそのタイプのクエリの何らかのキャッシュを行いますか?

4

2 に答える 2

5

あなたの質問に対する直接的な答えは「いいえ」です。MySQL はあなたが望むものをサポートしていません。あなたが本当に欲しいのはwith声明です。素晴らしい声明!必要に応じて、別のデータベースを使用してください。ああ。

アプローチはあなたがしていることとはかなり異なりますが、私はあなたがこれを行うことができると思います.

ロジックはmyposter、複雑なクエリからのすべての値を取得し、対応するが複雑なクエリにない場所myposterからのすべての値を取得することです。profiles_oldprofile_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;

残りは、これをクエリ全体に組み込むだけです。

于 2013-11-07T02:26:48.647 に答える
0

さまざまなアプローチで提案を行い、要件を確認しました。

/* 一時テーブルを作成します (必須ではありませんが、メモリ ストレージ エンジンを使用することをお勧めします): */

MYSQL> 一時テーブル tmp_intermediate_table engine=memory select COMPLEX QUERYを作成します。

次に、現在のユーザー セッションで実行されるクエリで tmp_intermediate_table テーブルを参照します。

于 2014-05-12T09:40:41.390 に答える