2011-05-12 82 views
0
def best_drivers(limit = 10) 
    lost = 'SELECT COUNT(c.id) FROM challenges AS c 
      WHERE (c.challenger_id = u.id AND c.challenge_state_id = 5) 
      OR (c.opponent_id = u.id AND c.challenge_state_id = 4)' 

    won = 'SELECT COUNT(c.id) FROM challenges AS c 
      WHERE (c.challenger_id = u.id AND c.challenge_state_id = 4) 
      OR (c.opponent_id = u.id AND c.challenge_state_id = 5)' 

    # WHERE statement prevents division by zero 
    find_by_sql(
    'SELECT u.*, cast(('+won+') as float)/(cast(('+won+') as float)+cast(('+lost+') as float)) AS win_ratio, ('+won+') AS won, ('+lost+') AS lost 
    FROM users AS u 
    WHERE ('+won+') > 0 
    ORDER BY win_ratio DESC, won DESC 
    LIMIT '+limit.to_s 
) 
end 

我正在使用此查询排序排名表中的用户,它工作正常。球员当前排名

现在我需要一个查询来告诉我show view中用户的当前排名。可能吗?

回答

1

您可以为查询添加“排名”并将其用作子选择。在周边查询用在哪里得到你的用户:

select * from 
    (select @rownum:[email protected]+1 ‘rank’, YOUR_QUERY from YOUR_TABLE, (SELECT @rownum:=0) r) e 
where user_id = 1; 

考虑缓存用户的级别,因为subquerys是“昂贵”(需要较长时间运行/需要多大的内存)。

1

请在尝试之前尝试Google,例如, “mysql select player rank”结果如下:Fast mySQL leaderboard with player rank (& surrounding players)这几乎可以回答你的问题。

然而,你想要做的任务是非常昂贵的。如果表格中有很多项目,我会考虑在用户的分数发生变化时将规格归一化并重新计入整个表格。