2009-08-06 6 views
0

Q: Comment faire pour que MySQL ne sélectionne que tous les utilisateurs qui ont joué => x nombre de jeux dans ces derniers jours?SQL Sélectionnez uniquement les joueurs ayant joué x nombre de parties au cours des derniers jours?

Tout cela est utilisé pour une échelle de jeu. J'utilise deux tables: weblPlayers a seulement les informations d'utilisateur (nom d'utilisateur, email, mot de passe etc), et weblGames a le résultat de chaque jeu rapporté avec la date et l'heure, correctement formaté, quand il a été signalé.

Voici les captures d'écran d'entre eux:

weblGames

WeblPlayers a les champs: player_id | nom | email | etc | etc. Les noms trouvés d'un gagnant ou perdant dans weblGames quand un jeu est rapporté correspondent aux mêmes noms trouvés dans WeblPlayers.

Répondre

2
SELECT userid, count(*) as numgames 
from weblGames g 
where g.dateplayed >= now() - y 
group by userid 
having count(*) > x 
; 

Vous pouvez toujours le joindre à weblPlayers pour obtenir le reste de l'information.

[Modifié]

Désolé - avait pas remarqué la chose gagnant et un perdant. Essayez:

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; 
+0

Merci beaucoup =) C'était parfait, juste nécessaire "jour" après le y. Le dessous choisirait chaque joueur qui a joué 3 ou plus de jeux les plus récents 4 jours: SELECT id_utilisateur, COUNT (*) AS cnt DE ( SELECT gagnant AS userid DE webl_games g OÙ g.reported_on> maintenant() - INTERVAL 4 JOUR UNION ALL SELECT perdant AS IDutilisateur DE webl_games g OÙ g.reported_on> maintenant() - INTERVAL 4 JOUR) t GROUP BY IDutilisateur HAVING COUNT (*)> = 3 – eyerouge

+0

Oh, yup ... Je n'avais pas considéré la fonction INTERVALLE. –

1

Ceci est dans la syntaxe MSSQL, mais vous donne l'idée. La seule chose non portable devrait être le DATEADD|DIFF pour obtenir la date du jour.

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 

L'astuce consiste à a) obtenir les gagnants et les perdants (le UNION ALL), et utiliser HAVING pour limiter les résultats après la GROUP BY.

Questions connexes