【问题标题】:Make MySQL show every users rating and then sort the results using ratings?让 MySQL 显示每个用户的评分,然后使用评分对结果进行排序?
【发布时间】:2009-08-06 23:45:01
【问题描述】:

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

这都是用于游戏天梯的。 weblGames 有每场报告的比赛的结果,并有关于谁赢/输的信息,以及赢家/输家的评分(winner_elo 和 loster_elo)。

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

当前 MySQL 代码仅使用此表显示(感谢这个地方)每个玩家的姓名和他在最近 x 天内玩的游戏数,.

我想保留该信息,但也能够输出每个玩家当前的 Elo Point(这等于他最近玩的游戏中的获胜者_elo 失败者_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

【问题讨论】:

    标签: sql mysql


    【解决方案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
    

    【讨论】:

    • 第一个成功了,只是将“user_elo”更正为“loser_elo”并在最后添加了排序依据。非常感谢你们花时间这么快地提供帮助,非常感谢。
    • @eyerouge:第二个确实应该更有效率。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多