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).
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
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
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
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
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.
Un cerveau c'est bien, plusieurs c'est mieux !
Un cerveau c'est bien, plusieurs c'est mieux !
Un cerveau c'est bien, plusieurs c'est mieux !
Un cerveau c'est bien, plusieurs c'est mieux !
Un cerveau c'est bien, plusieurs c'est mieux !