2009-08-06 5 views
1

Q: Comment faire en sorte que MySQL affiche également toutes les notes des utilisateurs, puis trier les résultats en utilisant les notes, desc?Faire en sorte que MySQL affiche toutes les évaluations des utilisateurs, puis trier les résultats en utilisant les évaluations?

Tout cela est utilisé pour une échelle de jeu. weblGames a le résultat de chaque jeu rapporté et a des informations sur qui a gagné/perdu, et ce qu'est devenu le classement gagnant/perdant (winner_elo & loser_elo).

Voici une capture d'écran partielle de la table: http://www.ubuntu-pics.de/bild/21059/screenshot_87_RTDZBb.png

En utilisant seulement ce tableau le code MySQL en cours affiche (grâce à ce lieu) tous les noms des joueurs et le nombre de jeux, il a joué dans les derniers jours de x, .

Je veux garder cette information, mais aussi être en mesure de sortie tous les joueurs en cours Elo Point (qui correspond à la winner_elo ou loser_elo dans son plus récemment jeu joué.)

Voici le code J'ai actuellement et qui affiche tous les joueurs et son/sa quantité de la plupart des jeux récents joués dans x jours:

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 

Répondre

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 

Le sous-requête peut être inefficace ici.

S'il est et votre table a une PRIMARY KEY, réécrire comme ceci:

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

D'abord on travaillait, juste corrigé « user_elo » à « loser_elo » et a ajouté le genre par la fin. Merci beaucoup d'avoir pris le temps de nous aider si rapidement, d'apprécier vraiment. – eyerouge

+0

@eyerouge: le second devrait vraiment être plus efficace. – Quassnoi

Questions connexes