SQL Выберите только игроков, которые играли в x игр за последние y дней? - PullRequest
0 голосов
/ 06 августа 2009

В: Как сделать так, чтобы MySQL только ВЫБИРАЛ всех пользователей, которые играли => x количество игр в течение в последние дни?

Это все используется для игровой лестницы. Я использую две таблицы: у weblPlayers есть только информация о пользователе (имя пользователя, адрес электронной почты, пароль и т. Д.), А у weblGames есть результат каждой сообщаемой игры, а также дата и время, правильно отформатированные, когда о ней было сообщено.

Вот скриншоты из них:

weblGames

У WeblPlayers есть поля: player_id | имя | электронная почта | и т. д. | и т. д. Имена, найденные победителем или проигравшим в weblGames при сообщении об игре, соответствуют тем же именам, что и в WeblPlayers.

Ответы [ 2 ]

2 голосов
/ 06 августа 2009
SELECT userid, count(*) as numgames
from weblGames g
where g.dateplayed >= now() - y
group by userid
having count(*) > x
;

Вы всегда можете присоединить его к weblPlayers, чтобы получить остальную информацию.

[Изменено]

Извините - не заметил победителя и проигравшего. Попробуйте:

SELECT userid, count(*) as cnt 
FROM
(
    SELECT winner as userid
    from weblGames g
    where g.reported_on >= now() - y
    UNION ALL
    SELECT loser as userid
    from weblGames g
    where g.reported_on >= now() - y
) t
GROUP BY userid
HAVING COUNT(*) > x;
1 голос
/ 06 августа 2009

Это в синтаксисе MSSQL, но дает вам представление. Единственный непереносимый материал должен быть DATEADD|DIFF, чтобы получить сегодняшнюю дату.

SELECT Name 
FROM (
    SELECT
        winner as Name,
        reported_on
    FROM webIGames
    UNION ALL
    SELECT
        loser as Name,
        reported_on
    FROM webIGames
) as AllPlayers
WHERE
     reported_on >= DATEADD(dd, 0 + @y, DATEDIFF(dd, 0, GETDATE()))
GROUP BY
     Name
HAVING
     COUNT(*) > @x

Хитрость заключается в том, чтобы: а) получить победителей и проигравших (UNION ALL) и использовать HAVING, чтобы ограничить результаты после GROUP BY.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...