3 votes

J'ai besoin d'extraire des données de mysql par un identifiant unique, un nombre maximum de tours, puis de les trier par une autre valeur.

Il y a quelques mois, j'ai posé une question sur un sujet similaire, j'ai reçu de l'aide et je pensais avoir la réponse. Trois mois plus tard, je constate que cela n'a pas fonctionné à 100 % et que j'ai besoin d'une aide supplémentaire, mais je peux mieux poser la question maintenant que je comprends mieux.

J'ai une table mysql avec id, userid, rounds, reps, exerciseid

J'ai besoin de tirer une série d'utilisateurs les plus hauts spécifiques à l'exercice pour lequel je tire. Ainsi, si le exerciseid était 8, j'aurais besoin de la ronde supérieure des utilisateurs pour ça. exerciseid mais si l'utilisateur a le même rounds plus d'une fois, ce qui arrive souvent, alors je dois trier cela par le reps pour me donner une véritable performance maximale. Maintenant, après avoir obtenu ces résultats, je dois trier cet ensemble de données par rounds , reps donc si plusieurs utilisateurs uniques ont le même rounds qui est ensuite ordonné par reps .

Est-ce que cela peut être fait avec mysql ou est-ce que je dois plutôt extraire les données et les trier avec PHP ?

SELECT
  max(l.rounds) as rounds,
  l.reps,l.userid
from leaderboard l
where l.exerciseid = 8 
group by l.userid 
order by 
  rounds desc,
  reps desc 

exemple de structure Tout d'abord, il s'agit d'un ensemble simple

userid  exerciseid  rounds  reps
--     --     --
1    8  23  10
1    8  23  15
1    8  20  10
2    8  28  19
2    8  15  12
3    8  40  29

results I want

userid  exerciseid  rounds  reps
--     --     --
3    8  40  29
2    8  28  19
1    8  23  15

0voto

Gordon Linoff Points 213350

Si je comprends bien, vous voulez d'abord regrouper par userid et rounds pour obtenir les maxreps sur un round. Ensuite, vous voulez sélectionner les tours maximums à partir de cela.

Voici une façon d'exprimer cela dans MySQL :

select userid, rounds, maxreps
from (SELECT userid, l.rounds, MAX(l.reps) as maxreps
      from leaderboard l
      where l.exerciseid = 8 
      group by l.userid, l.rounds
     ) ur
where exists (select 1 from leaderboard lb where ur.userid = lb.userid and lb.exerciseid = 8 group by lb.userid having max(rounds) = ur.rounds))
order by rounds desc, maxreps desc

0voto

Tiit Points 502

Comment :

SELECT
  max(l.rounds) as rounds,
  max(l.reps) as reps,l.userid
from leaderboard l
where l.exerciseid = 8 
group by l.userid, l.exerciseid 
order by 
  rounds desc,
  reps desc

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X