Заставить MySQL показывать рейтинг каждого пользователя, а затем сортировать результаты по рейтингу? - PullRequest
1 голос
/ 06 августа 2009

В: Как сделать так, чтобы MySQL также показывал рейтинг каждого пользователя, а затем сортировал результаты по рейтингу, desc?

Это все используется для игровой лестницы. У weblGames есть результат каждой сообщенной игры и информация о том, кто выиграл / проиграл, и каким стал рейтинг победителей / проигравших (winner_elo & loser_elo).

Вот частичный скриншот таблицы: http://www.ubuntu -pics.de / bild / 21059 / screenshot_87_RTDZBb.png

Используя только эту таблицу, текущий код MySQL отображает (благодаря этому месту) имя каждого игрока и количество игр, в которые он сыграл за последние x дней,.

Я хочу сохранить эту информацию, но также иметь возможность выводить у каждого игрока текущее очко Эло (что равно 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 Ответ

1 голос
/ 06 августа 2009
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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...