过滤最大的价值

时间:2012-06-29 18:09:05

标签: mysql sql

我正在尝试编写一个查询,该查询将返回每个操作符的Site的最高实例。基本上每个操作员可以有很多站点,但每个站点都有一个分数。我想过滤回报,以便不会多次列出给定的操纵子(每个站点一次),它将仅列出最高站点一次。

我下面的内容似乎返回了正确的结果,但速度相当缓慢,我想看看是否有更快的方法。

对不起,如果不是很清楚,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`

2 个答案:

答案 0 :(得分:0)

使用

GREATEST() 

有两个或更多论点。

答案 1 :(得分: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`  ))