Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Ranking] Récupérer la position d'un joueur

SQL, RANK, JOIN, HAVING, MYSQL

Sujet résolu
    1 juillet 2020 à 22:25:24

    Bonjour à toutes et tous,

    J'ai un classement qui me permet d'afficher des joueurs d'un évènement précis par ordre de points obtenus ou par nombre d'étapes (markers) activées.


    Ce que je souhaite faire maintenant, c'est pouvoir récupérer uniquement le rank (la position) d'un joueur par son ID en fonction du nombre d'étapes (markers) activées. Un évènement peut posséder 1 à une infinité d'étapes (bon c'est limité, mais c'est un grand chiffre).

    Pour ce faire, j'ai une table qui se nomme p_markers_checked, elle regroupe toutes les étapes activées par joueur, chaque étape est une nouvelle entrée. Une table p_guests qui regroupe tous les joueurs de tous évènements confondus, ils sont tous liés à un évènement qu'on nomme track. Enfin, p_tracks est la table qui regroupe les évènements.

    Voici ma requête :

    SELECT COUNT(*) AS ranking, (SELECT COUNT(PMC2.marker_checked_id)
                                 FROM
                                    p_markers_checked AS PMC2
                                 WHERE
                                    PMC2.p_guests_guest_id=2180) AS total_guest_markers_activated
                                     
    FROM p_markers_checked AS MC
     
        INNER JOIN p_guests AS G ON G.guest_id=MC.p_guests_guest_id
     
    WHERE
        G.p_tracks_track_id=813
     
    HAVING
        COUNT(MC.marker_checked_id) > (SELECT COUNT(PMC2.marker_checked_id)
                                       FROM
                                           p_markers_checked AS PMC2
                                       WHERE
                                           PMC2.p_guests_guest_id=2180);




    La colonne total_markers_activated est le nombre total d'étapes que le joueur a activé, c'est là juste pour vous aider à mieux comprendre, je n'en ai pas besoin dans ma requête. La colonne ranking est censée être la position du joueur (ID 2180) en question. Il faut savoir qu'au total il y a 8 étapes sur l'évènement portant l'ID 813. Cette requête me renvoie simplement le nombre total d'étapes et non le rank du joueur 2180 qui est normalement en position 1. Ma requête est mal faite mais je ne vois pas bien comment parvenir à mes fins.

    La question est :

    Comment arriver à récupérer la position du joueur 2180 en fonction du nombre total de markers (étapes) activé(e)s ?

    Merci de votre aide.

    Édite :

    Voici une autre requête qui me donne l'ordre inverse de la colonne rank, c'est à dire que le premier est dernier et le dernier premier :

    SET  @rnk=0;
    SELECT M.rnk, M.guest_id, M.markers
    FROM (SELECT
          	@rnk:=@rnk+1 AS rnk,
          	COUNT(*) AS markers, 
          	MC.p_guests_guest_id AS guest_id
          
          FROM 
          	p_guests G
          	LEFT JOIN 
          		p_markers_checked MC ON MC.p_guests_guest_id=G.guest_id
          
          WHERE 
          	G.p_tracks_track_id=813
          
          GROUP BY 
          	G.guest_id
          
          ORDER BY
          	markers DESC, 
          	MC.p_guests_guest_id ASC) 
       
          AS M
    
    WHERE guest_id=2180

     Le order est correct car je veux trier le classement par ordre de markers (étapes) activé(e)s (du plus grand au plus petit).

    -
    Edité par S@yf 2 juillet 2020 à 20:51:47

    • Partager sur Facebook
    • Partager sur Twitter

    Un cerveau c'est bien, plusieurs c'est mieux !

      3 juillet 2020 à 9:50:03

      N'hésitez pas à aussi intervenir s'il manque des informations !
      • Partager sur Facebook
      • Partager sur Twitter

      Un cerveau c'est bien, plusieurs c'est mieux !

        3 juillet 2020 à 9:55:22

        Bonjour,

        Pour moi la requête avec la variable incrémentée est correcte ...

        Si tu ne fais tourner que la sous-requête elle n'est pas triée comme voulu ?

        • Partager sur Facebook
        • Partager sur Twitter
        Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
          3 juillet 2020 à 10:31:51

          Benzouye a écrit:

          Bonjour,

          Pour moi la requête avec la variable incrémentée est correcte ...

          Si tu ne fais tourner que la sous-requête elle n'est pas triée comme voulu ?


          Bonjour Benzouye,

          Merci de ta réponse.

          Alors, la seconde requête affiche ceci :

          Ce joueur est censé être premier et non 5eme. Il a le nombre de markers (étapes) activés le plus élevé (3).

          Voici la même requête sans le WHERE pour t'afficher le classement avec les autres joueurs :

          (D'ailleurs les deux guest_id NULL, je ne sais pas d'où ça vient, ils sont tous censé avoir un ID).

          Ensuite, si je fais tourner uniquement la sous requête, j'ai exactement le même résultat.

          -
          Edité par S@yf 3 juillet 2020 à 10:32:36

          • Partager sur Facebook
          • Partager sur Twitter

          Un cerveau c'est bien, plusieurs c'est mieux !

            3 juillet 2020 à 13:34:15

            S@yf a écrit:

            les deux guest_id NULL, je ne sais pas d'où ça vient

            Tu affiches le guest_id de la table markers donc NULL y est possible ... ainsi cela devrait aller mieux :

            SELECT
            	@rnk:=@rnk+1 AS rnk,
            	COUNT(*) AS markers,
            	G.guest_id AS guest_id
            FROM
            	p_guests G
            		LEFT JOIN p_markers_checked MC
            			ON MC.p_guests_guest_id=G.guest_id
            WHERE G.p_tracks_track_id=813
            GROUP BY G.guest_id
            ORDER BY
            	markers DESC,
            	G.guest_id ASC

            Peux-tu poster le résultat de cette requête ?

            • Partager sur Facebook
            • Partager sur Twitter
            Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
              3 juillet 2020 à 14:02:01

              Benzouye a écrit:

              S@yf a écrit:

              les deux guest_id NULL, je ne sais pas d'où ça vient

              Tu affiches le guest_id de la table markers donc NULL y est possible ... ainsi cela devrait aller mieux :

              SELECT
              	@rnk:=@rnk+1 AS rnk,
              	COUNT(*) AS markers,
              	G.guest_id AS guest_id
              FROM
              	p_guests G
              		LEFT JOIN p_markers_checked MC
              			ON MC.p_guests_guest_id=G.guest_id
              WHERE G.p_tracks_track_id=813
              GROUP BY G.guest_id
              ORDER BY
              	markers DESC,
              	G.guest_id ASC

              Peux-tu poster le résultat de cette requête ?

              Effectivement, comme ça j'ai bien tous les ID, je n'y avais pas fait attention... merci :-°

              Voici le résultat de la requête :



              -
              Edité par S@yf 3 juillet 2020 à 14:02:41

              • Partager sur Facebook
              • Partager sur Twitter

              Un cerveau c'est bien, plusieurs c'est mieux !

                3 juillet 2020 à 14:18:07

                Apparemment MySQL fait le ORDER BY après l'incrémentation de la variable ... Je n'avais jamais fait attention à cela ...

                Du coup il faut faire deux sous-requêtes :

                SELECT
                	P.guset_id,
                	P.markers,
                	P.rnk
                FROM
                	(
                		SELECT
                			@rnk:=@rnk+1 AS rnk,
                			R.markers,
                			R.guest_id
                		FROM
                			(
                				SELECT
                					COUNT(*) AS markers,
                					G.guest_id AS guest_id
                				FROM
                					( SELECT @rnk:=0 ) AS ranking,
                					p_guests G
                						LEFT JOIN p_markers_checked MC
                							ON MC.p_guests_guest_id=G.guest_id
                				WHERE G.p_tracks_track_id=813
                				GROUP BY G.guest_id
                				ORDER BY
                					markers DESC,
                					G.guest_id ASC
                			) R
                	) P
                WHERE P.guest_id = 2180

                Attention cela ne traite pas les ex-æquo ...

                -
                Edité par Benzouye 3 juillet 2020 à 14:18:48

                • Partager sur Facebook
                • Partager sur Twitter
                Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                  3 juillet 2020 à 14:43:00

                  Benzouye a écrit:

                  Apparemment MySQL fait le ORDER BY après l'incrémentation de la variable ... Je n'avais jamais fait attention à cela ...

                  Du coup il faut faire deux sous-requêtes :

                  SELECT
                  	P.guset_id,
                  	P.markers,
                  	P.rnk
                  FROM
                  	(
                  		SELECT
                  			@rnk:=@rnk+1 AS rnk,
                  			R.markers,
                  			R.guest_id
                  		FROM
                  			(
                  				SELECT
                  					COUNT(*) AS markers,
                  					G.guest_id AS guest_id
                  				FROM
                  					( SELECT @rnk:=0 ) AS ranking,
                  					p_guests G
                  						LEFT JOIN p_markers_checked MC
                  							ON MC.p_guests_guest_id=G.guest_id
                  				WHERE G.p_tracks_track_id=813
                  				GROUP BY G.guest_id
                  				ORDER BY
                  					markers DESC,
                  					G.guest_id ASC
                  			) R
                  	) P
                  WHERE P.guest_id = 2180

                  Attention cela ne traite pas les ex-æquo ...

                  -
                  Edité par Benzouye il y a 12 minutes

                  Merci, c'est exactement ce que je cherchais à faire !

                  -
                  Edité par S@yf 6 juillet 2020 à 10:49:48

                  • Partager sur Facebook
                  • Partager sur Twitter

                  Un cerveau c'est bien, plusieurs c'est mieux !

                  [Ranking] Récupérer la position d'un joueur

                  × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                  × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                  • Editeur
                  • Markdown