Requête SELECT sur 2 tables avec un minimum à récupérer [Résolu]

Signaler
Messages postés
1623
Date d'inscription
samedi 3 janvier 2004
Statut
Membre
Dernière intervention
9 juin 2011
-
smathis
Messages postés
153
Date d'inscription
lundi 22 mars 2010
Statut
Membre
Dernière intervention
17 juin 2011
-
Hello,

J'aurais besoin d'un peu d'aide pour une p'tite requête récalcitrante.

Voilà mes 2 tables :
Table resultats [idResultat / idJoueur / temps]
Table joueurs [idJoueur / nom / prenom / ...]

Le but est de faire un classement bien sûr, les contraintes :
1) tous les résultats d'un même joueur sont enregistrés, il faut donc récupérer que le meilleur temps
2) afficher qu'une seule fois un même joueur dans le classement

Rendu attendu :
Position / Temps / nom / prénom

Je pense que la base de la requête serait de ce type :
SELECT * FROM resultats INNER JOIN joueurs ON resultats.idJoueur=joueurs.idJoueur
=> il manque le "min" et le distinct, mais je sais pas trop où mettre ça !

Merci d'avance à ceux qui voudront bien m'éclairer !

@+

6 réponses

Messages postés
1540
Date d'inscription
lundi 26 mai 2003
Statut
Membre
Dernière intervention
1 août 2013
11
Salut,

avec un GROUP BY tu devrais t'en sortir, tente un truc du genre :
SELECT J.prenom, J.nom, MIN(R.temps)
  FROM joueurs J, resultats R
 WHERE J.idJoueur = R.idJoueur 
 GROUP BY J.id
 ORDER BY MIN(R.temps) ASC

(ouai j'aime pas les INNER JOIN :p )

Il ne te restera plus qu'à faire le ranking.
Tu as alors 2 solutions :
- tu le fais avec un compteur, lors du parcours de résultat de ta requête, juste avant l'affichage,
- tu le fais à même ta requête avec une variable SQL, du genre :
SET @row := 0;
SELECT (@row := @row + 1) ... ;

(pour cette deuxième solution va falloir creuser de ton côté, j'utilise toujours la première méthode pour ma part)
Messages postés
153
Date d'inscription
lundi 22 mars 2010
Statut
Membre
Dernière intervention
17 juin 2011
1
Il faut agrandir le group by au prénom et nom, sinon il se peut que la requête ne passe pas. Même si c’était déjà un résultat unique, on m'a toujours dit que quand on utilise un group by on peut seulement afficher des colonnes du group by ou des fonctions (min, avg,...)

SELECT J.prenom, J.nom, MIN(R.temps)
  FROM joueurs J, resultats R
 WHERE J.idJoueur = R.idJoueur 
 GROUP BY J.id,J.prenom,J.nom
 ORDER BY MIN(R.temps) ASC
Messages postés
1540
Date d'inscription
lundi 26 mai 2003
Statut
Membre
Dernière intervention
1 août 2013
11
Ah, je veux bien te croire.
En fait ça fait un petit moment que je suis sur MySQL qui est très permissif.
En tout cas pour ma requête je l'ai testée et elle semble fonctionner.

Toutefois, en suivant ton principe, il vaudrait mieux faire comme tu le dis.
On ne sait jamais, ça peut peut-être varier d'un serveur MySQL à l'autre, ou suivant le paramétrage. Donc autant être le plus strict possible.
Messages postés
1623
Date d'inscription
samedi 3 janvier 2004
Statut
Membre
Dernière intervention
9 juin 2011
1
J'ai dû réadapter la requête car je vous avais simplifié le cas, mais un énorme merci pour cette base : au final j'ai réussi à afficher pile poil ce qu'il me fallait !

PS : un "LEFT JOIN" s'est quand même intégré dans ma requête finale ;)

@+ ! Samy
Messages postés
1623
Date d'inscription
samedi 3 janvier 2004
Statut
Membre
Dernière intervention
9 juin 2011
1
Ah au passage, j'ai pas mal de colonnes supplémentaires qui ne sont pas dans mon GROUP BY. Je n'avais jamais entendu parlé de cette nécessité de tout mettre dans le GROUP BY.

@+
Messages postés
153
Date d'inscription
lundi 22 mars 2010
Statut
Membre
Dernière intervention
17 juin 2011
1
Quand GROUP BY est présent, les expressions du SELECT ne peuvent faire référence qu'à des colonnes groupées, sauf à l'intérieur de fonctions d'agrégat, la valeur de retour d'une colonne non-groupée n'étant pas unique.

Source : http://docs.postgresqlfr.org/8.1/sql-select.html

Après ça dépend de ton SGBD j'imagine. Mais ça peut être un bon réflexe qui évitera des résultats inattendu un jour.