2012-04-26 12 views
1

私は値がテーブルの最大値と最小値の間にあるかどうかをチェックするSQLクエリを持っています。次のように私は今、これを実装しました:私は凸包から4回、私はこのクエリを実行するたびに選択していますので、これは、非常にゆっくりと実行されているmin()とmax()の効率的な使い方は?

SELECT spectrum_id, feature_table_id 
FROM 'spectrum', 'feature' 
WHERE `spectrum`.msrun_msrun_id = 1 
AND `feature`.msrun_msrun_id = 1 
AND (SELECT min(rt) FROM `convexhull` WHERE `convexhull`.feature_feature_table_id = `feature`.feature_table_id) <= scan_start_time 
AND scan_start_time <= (SELECT max(rt) FROM `convexhull` WHERE 'convexhull'.feature_feature_table_id = 'feature'.feature_table_id) 
AND (SELECT min(mz) FROM `convexhull` WHERE `convexhull`.feature_feature_table_id = `feature`.feature_table_id) <= base_peak_mz 
AND base_peak_mz <= (SELECT max(mz) FROM `convexhull` WHERE `convexhull`.feature_feature_table_id = `feature`feature_table_id) 

、私はインナーを使用してそれを改善しようとした参加:

SELECT spectrum_id, feature_table_id 
FROM 'spectrum', 'feature' 
INNER JOIN `convexhull` ON `convexhull`.feature_feature_table_id = `feature`.feature_table_id 
WHERE `spectrum`.msrun_msrun_id = ? "+ 
AND `feature`.msrun_msrun_id = ? "+ 
AND min(`convexhull`.rt) <= scan_start_time "+ 
AND scan_start_time <= max(`convexhull`.rt) "+ 
AND min(`convexhull`.mz) <= base_peak_mz "+ 
AND base_peak_mz <= max(`convexhull`.mz)", spectrumFeature_InputValues) 

ただし、min()およびmax()ステートメントはselectステートメントの後にのみ使用できます。どのようにして最初のクエリをより効率的にすることができるので、4つのクエリを実行せずに最小および最大のrtおよびmzを得ることができますか?

答えて

6

EDIT:いくつかのより多くの分を持っていたし、再び見て、すべてのデータを実現し、その一つのテーブルから来ているので、このようなものが

SELECT 
    spectrum_id 
    ,feature_table_id 
FROM 
    spectrum AS s 
    INNER JOIN feature AS f 
     on f.msrun_msrun_id = s.msrun_msrun_id 
    INNER JOIN (select 
     feature_feature_table_id 
     ,min(rt) AS rtMin 
     ,max(rt) AS rtMax 
     ,min(mz) AS mzMin 
     ,max(mz) as mzMax 
    FROM 
     convexhull 
    GROUP BY 
     feature_feature_table_id 
    ) AS t 
    ON t.feature_feature_table_id = f.feature_table_id 
WHERE 
    s.msrun_msrun_id = 1 
    AND s.scan_start_time >= t.rtMin 
    AND s.scan_start_time <= t.rtMax 
    AND base_peak_mz >= t.mxMin 
    AND base_peak_mz <= t.mzMax 

を動作するはずです、私はあなたがで凸包テーブルやグループから選択するようにしたいと思いますfeature_feature_table_idは、そのグループ内の最小および最大rtを取得します。

あなたはその選択を角かっこで囲み、名前を付けて(tとして)それに参加することができます。ここではサンプル・スキーマを作成していない場合は、これがenoughtです

希望は...道であなたを取得するには:http://sqlfiddle.com/

をし、あなたのクエリに入れて、私はそれを修正することができます。

サイドノートとして、私はあなたが特定のフィールドにこれらのテーブルを結合するのではなく句が比較どこの両方から選択するワンだと思う:

SELECT spectrum_id, feature_table_id 
FROM 'spectrum', 'feature' 
WHERE `spectrum`.msrun_msrun_id = 1 
AND `feature`.msrun_msrun_id = 1 

と:

SELECT 
    spectrum_id 
    ,feature_table_id 
FROM 
    spectrum AS s 
    INNER JOIN feature AS f 
     on f.msrun_msrun_id = s.msrun_msrun_id 
WHERE 
    s.msrun_msrun_id = 1 

場合、私私に知らせて間違ったことがあります。

+0

あなたが書いたトップ部分のテストが終わったばかりで、約3倍の速さで検索できました。ありがとう! –

+0

データがまだ正しい限り;-) – gordatron