0

オペロンあたりのサイトの最高のインスタンスを返すクエリを作成しようとしています。基本的に各オペロンは多くのサイトを持つことができますが、各サイトにはスコアがあります。特定のオペロンを複数回 (サイトごとに 1 回) リストするのではなく、最も高いサイトで 1 回だけリストされるように、リターンをフィルター処理したいと考えています。

以下にあるものは正しい結果を返すようですが、かなり遅いので、これを行うより速い方法があるかどうかを確認したかったのです。

これがあまり明確でない場合は申し訳ありませんが、MySQL は私にとってまったく新しい世界であり、賢明な方法で質問を投げかけているかどうかはわかりません。

select `g`.`id`       AS `ID`, 
   `g`.`Name`     AS `GENE`,
   `o`.`id`       AS `OPID`,
   `os`.`site`    AS `BSID`,
   `s`.`Sequence` AS `SITE`,
   `s`.`Score`    AS `SCORE`

from(((( 
          `METAGENO`.`GENE`        `g` )
     join `METAGENO`.`OPERON`      `o` )
     join `METAGENO`.`OPERON_SITE` `os`)
     join `METAGENO`.`SITE`        `s` )

    where(
          (`o` .`id`     = `g` .`Operon`)
       and(`os`.`operon` = `o` .`id`    )
       and(`s` .`id`     = `os`.`site`  
       and(`s` .`Score`  = (select max(`s2`.`Score`)
                                from(`METAGENO`.`SITE` `s2`)
                                where(`s2`.`id` = `os`.`site`))))) GROUP BY `o`.`id`
4

2 に答える 2

0

使用する

GREATEST() 

2 つ以上の引数の場合。

于 2012-06-29T18:17:17.583 に答える
0

すべての ID のすべての maxscore を計算してから結合するインライン ビューを作成してみてください。

Select `g`.`id`       AS `ID`, 
   `g`.`Name`     AS `GENE`,
   `o`.`id`       AS `OPID`,
   `os`.`site`    AS `BSID`,
   `s`.`Sequence` AS `SITE`,
   `s`.`Score`    AS `SCORE`

from(((( 
          `METAGENO`.`GENE`        `g` )
     join `METAGENO`.`OPERON`      `o` )
     join `METAGENO`.`OPERON_SITE` `os`)
     join `METAGENO`.`SITE`        `s` )

     INNER JOIN (select max(`s2`.`Score`) as maxScore, `s2`.`id`
                 from `METAGENO`.`SITE` `s2`
                 group by `s2`.`id`) maxScore
     ON  s.Score = maxScore.Score
         AND os.site = maxScore.id

    where(
          (`o` .`id`     = `g` .`Operon`)
       and(`os`.`operon` = `o` .`id`    )
       and(`s` .`id`     = `os`.`site`  ))
于 2012-06-29T18:17:47.540 に答える