2012-01-20 1 views
0

、私は大体このようなクエリを構築していますDrupalの6、PHP 5.3、とMySQLでの作業:埋め込みMySQLの選択を何度も「キャッシュ」できますか?

SELECT val from table [and some other tables joined in below] 
    where [a bunch of clauses, including getting all the tables joined up] 
     and ('foo' not in (select ...)) 
     and (('bar' in (select...) and x = y) 
      or ('baz' in (select ...) and p = q)) 

私が何をしようとしているの偉大な表現ではないですが、うまくいけば、それは意志足ります。要点は、クエリの途中に何度も使用される埋込みSELECTがあることです。それは常に同じです。完全に自己完結型ではありません。クエリの最上位にあるテーブルの1つから引き出された値に依存します。

は、私はちょうどそれが必要なのたびにクエリを繰り返すために少しは/罪悪汚れた感じているが、私は一度値を計算し、必要に応じて再利用する他の方法が表示されません。それが最上位レベルのテーブルから値を参照するので、私は、MySQL変数を介して、またはクエリ文字列の周りmonkeyingいずれかによって、クエリ外一度計算するだけクエリに値を挿入することができません。とにかく、とにかく、私は思う。

私はこれについて何かできることはありますか?コードは厄介かもしれませんが、MySQLは値自体をキャッシュし、何度も何度もクエリを実行しないように十分にスマートであるparhaps:または、多分それはパフォーマンスの観点から非問題ですか?何かアドバイス?ありがとう!

+0

なぜ関数呼び出しでそのテストをオンにしませんか? 'FoundInTable( 'foo')とNot FoundInTable( 'bar')とFoundInTable( 'baz')'? –

+0

説明から、依存サブクエリがあるようです。悪いニュース:パフォーマンスにはあまり効果がありません(これはおそらく目にしています)。良いニュース:ほとんどの場合、これははるかに速い 'JOIN'に書き直すことができます。私たちはもう少し詳細を見る必要があります。 – Mchl

+0

Thxの両方。 @BradChristie:私は、ストアドプロシージャに関する私をhanstringingさはDrupal 6、中だ(私が最初に考えたが、D6はmysqliのを使用するようにコアをハックすることなく、それらをサポートしていません)。 Mchi:あなたは両方のアカウントの権利です。私はそれをモンスターの参加として考えることにします。 –

答えて

0

SELECTは実際には単なるテーブルなので、SELECT ... AS aliasを実行してから別のクエリでin aliasを使用すると、結果のエイリアスを作成できるはずです。

+0

Hmm。私はこれを試みたが、失敗している。これはおそらくコメントとしては判読できませんが、---(( ''誰もいないような単純なケースでは、(profile_values pvalからTHE_ALIASとしてpval.valueを選択してください) \t \tここで、pfields.fid = pval.fid \t \t \tとpfields.name = 'FOO' \t \t \tとpval.uid = cc.uid)) 及び(THE_ALIASで(​​ '誰') 又はTHE_ALIASで(​​ 'Any_Member'))--- 私はパート最初の「THE_ALIASの 『誰でも』」で、構文エラーを取得します。(以前のクエリでは、最大参加cc.uidがテーブル/値です。)任意の考え? –

+0

その代わりに、前のクエリで一時テーブルを作ります - 'CREATE TEMPORARY TABLE the_エイリアスSELECT ... ' – Tim

+0

ええ、私はそれについて考えていました。私はそれを試してみましょう。 –

関連する問題