1

値がテーブルの最大値と最小値の間にあるかどうかを確認するSQLクエリがあります。これを次のように実装しました。

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)

このクエリを実行するたびに凸包から4回選択しているため、これは非常にゆっくりと実行されます。そのため、内部結合を使用して改善を試みました。

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を取得できるように、最初のクエリをより効率的にするにはどうすればよいですか?

4

1 に答える 1

6

編集:さらに数分かかり、もう一度見て、すべてのデータがその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
    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を取得すると思います。

次に、そのselectを角かっこで囲み、名前(tとして)を付けて結合します。

これで外出先に行くのに十分だといいのですが。そうでない場合は、ここでサンプルスキーマを作成してください:http ://sqlfiddle.com/

クエリを入力すると、変更できます。

補足として、where句を比較して両方から選択するのではなく、特定のフィールドでこれらのテーブルを結合したいと思います。

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

何か問題があった場合はお知らせください。

于 2012-04-26T13:19:52.037 に答える