我正在尝试编写一个查询,它将返回每个Operon的站点的最高实例。基本上每个操纵子可以有多个站点,但每个站点都有一个分数。我希望过滤返回,而不是多次列出给定的operon (每个站点一次),它将只在最高的站点列出一次。
我在下面看到的似乎返回了正确的结果,但它相当慢,我想看看是否有更快的方法来做这件事。
抱歉,如果这不是很清楚,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`发布于 2012-06-30 02:17:18
使用
GREATEST() 用于两个或多个参数。
发布于 2012-06-30 02:17:48
您可以尝试创建一个内联视图,该视图计算所有id的最大分数,然后连接。
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` ))https://stackoverflow.com/questions/11266827
复制相似问题