|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||||||
|
Invité de passage
![]() Inscription : juin 2011 Messages : 7 ![]() |
Bonjour, j'ai fait un jeu pour un site.
Je sauve différentes infos dans deux tables : -table utilisateurs ("users") Code :
Code :
Ce que je voudrais faire, C'est une requête qui sélectionne les meilleurs scores pour un mois spécifique, en les triant par ordre de scores décroissant. Attention toutefois, les utilisateurs peuvent jouer autant de fois qu'ils le souhaitent, et j'aimerais que les résultats de la requête ne me sortent que le meilleur résultat des utilisateurs. Donc en gros -filtrer les meilleurs résultats -selon un mois -en évitant les doublons (conserver seulement le meilleur score de l'utilisateur) J'ai déjà travaillé à construire la requête, mais je ne suis pas sûr qu'elle soit correcte. En tout cas, elle fonctionne, mais me renvoie des doublons pour les utilisateurs. Merci pour votre aide ! Code :
|
||||||
|
|
00
|
|
|
#2 |
|
Expert Confirmé
![]() ![]() Avcxjo MoKoRetraité Inscription : novembre 2005 Messages : 2 530 ![]() |
Saluton,
Il te suffit, dans ta requête de changer hall_of_fame.score, par MAX(hall_of_fame.score) AS score et d'ajouter dans ta requête, avant la ligne ORDER BY où tu changeras hall_of_fame.score par score, GROUP BY users.id Par contre la valeur de hall_of_fame.time retenue, si elle correspondra bien aux critères de la clause WHERE YEAR(hall_of_fame.time) = '2011' AND MONTH(hall_of_fame.time) = '5', ne sera pas forcément celle de la ligne contenant le score MAX.
__________________
Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof articles : Comment émuler un tableau croisé [quasi] dynamique et : Une énigme mathématique résolue avec MySQL recommande l'utilisation de PDO (PHP5 Data Objects) |
|
00
|
|
|
#3 | |||
|
Invité de passage
![]() Inscription : juin 2011 Messages : 7 ![]() |
Citation:
Donc ce que tu veux me dire, c'est que cela retournera bien les résultats que je veux (et sur la bonne période, càd à l'intérieur d'un mois -ici, mai-), mais que le champs hall_of_fame.time retourné ne sera pas spécialement celui de la ligne correspondante au meilleur score, c'est ça ? Si oui, c'est pas un problème. Mais je remarque que le "hall_of_fame.id" retourné ne correspond pas non plus au score affiché. Possible de faire correspondre ça (et le hall_of_fame.time, tant qu'on y est, c'est tjs mieux) ? Ce serait plus facile... Voici ce que j'ai pour l'instant donc Code :
merci ! |
|||
|
|
00
|
|
|
#4 |
![]() ![]() ![]() Cédric DuprezInscription : avril 2002 Messages : 3 823 ![]() |
Bonjour,
C'est une question qui est souvent posée. Par exemple, tu peux t'inspirer de la solution donnée dans la discussion suivante : http://www.developpez.net/forums/d10...s/aide-select/ Ou encore, une autre solution proposée dans les sources MySQL : http://mysql.developpez.com/telechar...aque-categorie
__________________
Rédacteur / Modérateur SGBD Mes tutoriels et la FAQ MySQL ---------------------------------------------------- Pensez aux balises code et au tag Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça
|
|
|
00
|
|
|
#5 | ||
|
Membre Expert
![]() Inscription : août 2008 Messages : 1 271 ![]() |
Normal que ça ne fonctionne pas, toutes les colonnes présentes dans le SELECT et non aggrégées doivent être dans le GROUP BY.
Seul MySql permet de déroger à cette règle et décide de renvoyer un résultat aléatoire donc faux. A lire sur le GROUP BY et MySql Avec MySql, pas le choix, il faut faire des sous-requêtes : Code :
Il faudra donc créer un autre niveau de sous-requête si tu choisis de ne prendre que le meilleur score le plus récent par exemple. |
||
|
|
00
|
|
|
#6 | ||
|
Invité de passage
![]() Inscription : juin 2011 Messages : 7 ![]() |
Merci skuatamad,
Malheureusement cela ne fonctionne pas: Unknown column 'u.user_id' in 'on clause' J'ai changé pour Code :
qui a été modifié pour En parlant de ça, pourquoi est-ce que j'ai des résultats différents si je fais user_id (sans préfixe du genre "u.") ayant été défini ici Bref, si la requête est déjà correcte comme ça; même avec des doublons concernant les scores, c'est déjà pas mal. |
||
|
|
00
|
|
|
#7 |
|
Membre Expert
![]() Inscription : août 2008 Messages : 1 271 ![]() |
Je me suis planté dans le nom de la colonne, dans ma requête ça devrait plutôt être :
h2 ON u.id = h2.user_id |
|
|
00
|
Copyright © 2000-2012 - www.developpez.com