Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 01/11/2012, à 19:25

Phoenamandre

MySQL et code à comprendre (usage de distinct)

Bonjour à tous.

Voilà, j'ai à vous exposer un problème assez étrange (pas pour autant compliqué, j'espère)
J'ai repris un vieux code que j'avais pour un site il y a quelques années, je l'ai bidouillé, et j'en suis arrivé à quelque chose qui fonctionne sans que je ne sache pourquoi, ce qui est frustrant.
Aussi je me tourne vers vous pour m'aider.

Tout d'abord, une brève explication :
j'ai une table Statistiques, qui contient un champs ID, IDUser, IDGame et Score.

Mon but ici est d'établir un classement en prenant le meilleur score de chaque joueur.
Mon code :

SELECT DISTINCT A.*  
 FROM Statistiques A 
 WHERE A.ID = (SELECT MAX(B.ID)
                            FROM Statistiques B 
                            WHERE B.IDUser = A.IDUser)
ORDER BY A.Score  DESC

Il fonctionne (semble-t-il).

Voilà ce que je ne comprends pas :
le DISTINCT A.* fait-il un distinct sur chaque colonne ?
Quelle requête SELECT est effectuée en première ? J'ai l'impression que l'une ne peut fonctionner sans l'autre…

Si vous pouviez m'éclairer, je vous en serais vraiment reconnaissante !

D'avance merci,

Ubunterosement,

Hors ligne

#2 Le 06/11/2012, à 06:27

Melrock

Re : MySQL et code à comprendre (usage de distinct)

Bonjour,
Sauf erreur (mais ça fait quelques années que je n'ai pas utilisé SQL) le DISTINCT s'applique au n-uplet sélectionné. C'est à dire que si la réponse sans le distinct était :
     machin 1 | truc 1 | bidule 1
     machin 1 | truc 1 | bidule 1
     machin 1 | truc 2 | bidule 1
     machin 2 | truc 2 | bidule 2
avec le DISTINCT, il resterait :
     machin 1 | truc 1 | bidule 1
     machin 1 | truc 2 | bidule 1
     machin 2 | truc 2 | bidule 2

Les deux requêtes s'exécutent en même temps : la deuxième requête (SELECT MAX (B.ID) ...) est lancée à chaque ligne de la première, pour savoir si la condition est vérifiée.


Tout problème a sa solution, donc s'il n'y a pas de solution, c'est qu'il n'y a pas de problème.

Hors ligne

#3 Le 06/11/2012, à 11:19

PengouinPdt

Re : MySQL et code à comprendre (usage de distinct)

DISTINCT sert à retourner un seul et même résultat pour une donnée, visibles plusieurs fois.

Et ta requête se lit ainsi : le deuxième select est exécuté, en premier, puis est "filtré" par le premier !
(à moins que je ne me trompe...)

Par contre, même si je sais ce que signifie MAX(B.ID), je n'en comprends pas l'intérêt ...


Ego ~
YUP.py :: Yet Uploader Pixxie.py :: script python : post d'images sur forum !

Hors ligne

#4 Le 14/11/2012, à 10:27

Tapriuneclak

Re : MySQL et code à comprendre (usage de distinct)

Au vu de ce que tu demande, j'aurais plutôt écrit ta requête de cette façon :

SELECT ID, IDUser, IDGame, max(Score)
FROM Statistiques A 
GROUP BY ID, IDUser, IDGame 
ORDER BY A.Score  DESC;

mais bon à tester


TFT DELL 24" + Q9650/3,8Ghz + DFI + 8Go ram + 2 To HDD + ATI HD4870X2
Q6600/2,8Ghz + DFI + 2Go ram + 8 To HDD + Nvidia 8500GT

Hors ligne