将这两个查询合并为一个

时间:2010-05-27 14:03:52

标签: mysql

我只是想知道是否有更有效的方法来做到这一点。

我有一张桌子,可以跟踪不同Flash游戏的用户分数。表games_scores的定义如下:

alt text http://img13.imageshack.us/img13/7262/structure1.png

每个用户可以为此表中的任何游戏提供多个条目。当我显示记分板时,我只选择每个用户的MAX分数。没什么好看的。

如果他没有出现在记分牌上,那么我正在做的是显示被允许使用的用户的位置(该牌照仅显示前20名玩家)。我用两个查询完成了这个。第一个告诉我用户的位置:

SELECT
 COUNT(*) + 1
FROM (
 SELECT
  MAX(score)
 FROM
  games_scores gs
 WHERE
  gs.games_id = ?
  AND gs.score > (
   SELECT
    MAX(gs2.score)
   FROM
    games_scores gs2
   WHERE
    gs2.games_id = ?
    AND gs2.users_id = ?
    AND gs2.add_time = ?
  )
  AND gs.add_time = ?
 GROUP BY
  gs.users_id
) AS tmp_table

第二个给了我他的分数:

SELECT
 MAX(gs.score)
FROM
 games_scores gs
WHERE
 gs.games_id = ?
 AND gs.users_id = ?
 gs.add_time >= ?

我想知道是否有更有效的方法吗?例如,将查询组合成一个。

1 个答案:

答案 0 :(得分:1)

您要找的是分组最大值:http://jan.kneschke.de/projects/mysql/groupwise-max/