2010-12-15 92 views
12

je le tableau suivant:groupe mysql par et trier chaque groupe

ID NAME TIME 
1 A 0 
2 A 3 
3 B 1

J'utilise la requête ci-dessous qui produit:

SELECT * FROM `table` GROUP BY `NAME` 
ID NAME TIME 
1 A 0 
3 B 1

Et je veux utiliser GROUP BY pour générer un résultat comme celui-ci (sorte de réduction par la colonne TIME):

ID NAME TIME 
2 A 3 
3 B 1
+1

En lisant votre question, il est peu claire de la façon dont vous voulez que la champs à trier. – Starx

+0

Ce n'est pas 100% clair quel résultat exactement vous essayez d'obtenir. Peut-être essayer d'articuler * ce que vous voulez vraiment faire. – Josh

+0

Mais que faire si je veux "commander par" aller à l'ordre naturel? –

Répondre

15
SELECT NAME, MAX(TIME) as TIME 
FROM table 
GROUP BY time 
ORDER BY time DESC 
+0

Cela a réellement fonctionné pour moi. Cela me donne moins d'informations que les solutions basées sur les sous-requêtes, mais c'est plus rapide. –

+3

Il n'y a aucune garantie que la colonne 'NAME' sera de la même ligne que' MAX (TIME) '. Il peut très bien fonctionner compte tenu des données ci-dessus ou d'un petit ensemble de données mais n'est en aucun cas fiable. Pour une discussion approfondie, voir http://stackoverflow.com/questions/14770671/mysql-order-by-before-group-by?noredirect=1#comment63515985_14770671 –

+0

C'est du travail! Il semble que seule la clause 'ORDER BY' peut accepter l'alias dans la clause' SELECT', une belle astuce. – JasonMing

0

Eh bien, vous devez décider ce que vous voulez voir dans l'ID et les champs d'heure après le groupe. Par exemple, je vais sélectionner le MAX (ID) et le SUM (temps), puis l'ordre par totaltime desc.

SELECT MAX(id), name, SUM(time) AS totaltime 
FROM YourTableName 
GROUP BY name 
ORDER BY totaltime DESC 

Espérons que cela aide.

6
select * from (select * from table order by TIME DESC) t group by NAME