Requête SELECT sur 2 tables avec un minimum à récupérer

Résolu
cs_goldenboy68 Messages postés 1596 Date d'inscription samedi 3 janvier 2004 Statut Membre Dernière intervention 9 juin 2011 - 7 juin 2011 à 21:43
smathis Messages postés 153 Date d'inscription lundi 22 mars 2010 Statut Membre Dernière intervention 17 juin 2011 - 9 juin 2011 à 09:36
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

cs_jopop Messages postés 1540 Date d'inscription lundi 26 mai 2003 Statut Membre Dernière intervention 1 août 2013 12
8 juin 2011 à 11:36
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)
3
smathis Messages postés 153 Date d'inscription lundi 22 mars 2010 Statut Membre Dernière intervention 17 juin 2011 5
8 juin 2011 à 16:40
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
0
cs_jopop Messages postés 1540 Date d'inscription lundi 26 mai 2003 Statut Membre Dernière intervention 1 août 2013 12
8 juin 2011 à 16:57
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.
0
cs_goldenboy68 Messages postés 1596 Date d'inscription samedi 3 janvier 2004 Statut Membre Dernière intervention 9 juin 2011 2
9 juin 2011 à 00:54
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_goldenboy68 Messages postés 1596 Date d'inscription samedi 3 janvier 2004 Statut Membre Dernière intervention 9 juin 2011 2
9 juin 2011 à 00:57
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.

@+
0
smathis Messages postés 153 Date d'inscription lundi 22 mars 2010 Statut Membre Dernière intervention 17 juin 2011 5
9 juin 2011 à 09:36
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.
0
Rejoignez-nous