SQL : Requête SELECT sur 2 tables avec un minimum à récupérer [Résolu] - SQL - CodeS SourceS
Requête SELECT sur 2 tables avec un minimum à récupérer [Résolu]
cs_goldenboy68
- 7 juin 2011 à 21:43
- 9 juin 2011 à 09:36
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 !
Requête select sur 2 tables avec un minimum à récupérer
Requete select sur une table foxpro ✓ - Forum - Foxpro
Select sur 2 tables d'un champ similaire ✓ - Forum - PHP
[SQL Server 2000] Requete SQL Comparer 2 table ✓ - Forum - SQL
Requete SELECT * sur plusieurs tables ✓ - Forum - VB.NET
Requette SQL ds 2 tables ✓ - Forum - PHP
8 juin 2011 à 11:36
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)
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,...)
GROUP BY J.id,J.prenom,J.nom
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.
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
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.
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.