2010-05-27 113 views
4

我只是想知道是否有一个更有效的方式来做到这一点。加入这两个查询到一个

我有一张桌子,可以跟踪不同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 >= ? 

我不知道是否有这样做的更有效的方法?将查询合并为一个例子。

回答