#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 ...
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