11
votes

Mysql: "Ordre par" Intérieur du groupe par "

J'ai une table mysql de noms , qui se compose de deux champs: nom et rang . Le nom nom n'est pas unique peut avoir plusieurs correspondances.

Le problème: je veux sélectionner des enregistrements, groupés par nom , mais s'il y a plus d'un nom , celui avec le rang le plus élevé devrait être pris.

Un exemple:

Tom 2

ben 1

ben 2

Sélectionnez * à partir de noms Groupe par Nom Commande par Rank Desc

retourne généralement:

Tom 2

ben 1

J'ai besoin de:

Tom 2

ben 2

Comme il y a deux bens, mais le second avec un rang supérieur.

Il semble que le groupement MySQL prend le prénom et ignore le reste.

Comment puis-je commander des enregistrements dans "groupe par", afin que je puisse dire quel enregistrement doit être pris, s'il y a plus d'un avec le même nom ?


0 commentaires

3 Réponses :


8
votes

Vous avez besoin d'un Fonction d'agrégat appelée max : xxx

De cette façon, vous récupérerez tous les noms distincts, chacun associé à son rang Max.


3 commentaires

Vous devez toujours utiliser groupe par nom de sorte que le max (grade) par nom est renvoyé et non le maximum ( rang) .


@Dennis: Oui. déjà ajouté cette partie. oublié avec la ruée pour que la question soit la question soit la première. :-)


Cela donne aux lignes où chaque nom a le rang Max, ce que vous vouliez seulement le nom qui avait le rang Max?



3
votes

Utiliser max () : xxx


0 commentaires

7
votes

Pour moi, il a été fonctionné:

Pour prendre la dernière rangée dans un groupe: P>

select * from 
( select name, rank from names order by rank desc ) as a 
group by name


3 commentaires

La syntaxe n'est pas correcte (vous ne pouvez pas SELECT * tandis que groupe par nom )


Je suppose que vous n'avez pas essayé de le faire, car, si vous aviez essayé, vous savez que cela fonctionne. Non seulement sur cet exemple, mais vous pouvez également obtenir toutes les informations sur la ligne Max Row.


+1 Vous avez raison, je ne savais pas que mySQL prend en charge une telle syntaxe. MSSQL et oracle ne ...