2009-08-06 50 views
1

问:我如何让MySQL也显示每个用户的评分,然后使用评分,desc对结果进行排序?让MySQL显示每个用户的评分,然后使用评分对结果进行排序?

这全部用于游戏阶梯。 weblGames有每个报道的比赛结果,并有关于谁赢/输的信息以及赢家/输家评分变得如何(赢家_elo & loser_elo)。

下面是表的部分截图:http://www.ubuntu-pics.de/bild/21059/screenshot_87_RTDZBb.png

仅使用此表来对当前MySQL的代码显示(感谢这个地方)每一个球员的名字和游戏的数量,他内最近x天出场, 。

我想保留这些信息,而且还能够输出每一个玩家当前的Elo点(这等于winner_elo loser_elo他最近玩过的游戏。)

这里是代码我现在有,并且显示在X天内每一个球员和他/她的最近玩的游戏数量:

SELECT userid, count(*) as cnt 
FROM 
(
SELECT winner as userid 
from webl_games g 
where (g.reported_on > now() - interval 4 day 
UNION ALL 
SELECT loser as userid 
from webl_games g 
where g.reported_on > now() - interval 4 day 
) t 
GROUP BY userid 
HAVING COUNT(*) >= 3 

回答

1
SELECT userid, COUNT(*) as cnt, 
     (
     SELECT CASE t.userid WHEN winner THEN winner_elo ELSE loser_elo END 
     FROM webl_games l 
     WHERE t.userid IN (winner, loser) 
     ORDER BY 
       reported_on DESC 
     LIMIT 1 
     ) AS last_elo 
FROM (
     SELECT winner as userid 
     FROM webl_games g 
     WHERE (g.reported_on > now() - interval 4 day 
     UNION ALL 
     SELECT loser as userid 
     FROM webl_games g 
     WHERE g.reported_on > now() - interval 4 day 
     ) t 
GROUP BY 
     userid 

的子查询在这里可以是无效率的。

如果是,你的表中有一个PRIMARY KEY,把它改写为这样的:

SELECT userid, cnt, 
     (
     SELECT q2.userid WHEN winner THEN winner_elo ELSE loser_elo END 
     FROM webl_games l 
     WHERE l.id IN (lwin, llose) 
     ORDER BY 
       reported_on DESC 
     LIMIT 1 
     ) 
FROM (  
     SELECT userid, COUNT(*) as cnt, 
       (
       SELECT id 
       FROM webl_games l 
       WHERE t.userid = winner 
       ORDER BY 
         reported_on DESC 
       LIMIT 1 
       ) AS lwin, 
       (
       SELECT id 
       FROM webl_games l 
       WHERE t.userid = loser 
       ORDER BY 
         reported_on DESC 
       LIMIT 1 
       ) AS llose 
     FROM (
       SELECT winner as userid 
       FROM webl_games g 
       WHERE (g.reported_on > now() - interval 4 day 
       UNION ALL 
       SELECT loser as userid 
       FROM webl_games g 
       WHERE g.reported_on > now() - interval 4 day 
       ) t 
     GROUP BY 
       userid 
     ) q2 
+0

首先一个能用的,只是纠正“user_elo”到“loser_elo”,并在末尾添加排序。非常感谢你花时间尽快帮忙,非常感谢。 – eyerouge 2009-08-06 15:41:47

+0

@eyerouge:第二个应该更有效率。 – Quassnoi 2009-08-06 15:45:18

相关问题