2010-12-15 114 views
12

我有如下表:MySQL的GROUP BY和排序每组

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

我使用下面的查询产生:

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

而且我想用GROUP BY生成一个结果如下(按TIME列排序):

ID NAME TIME 
2 A 3 
3 B 1
+1

通过阅读你的问题,这是有些不明确的,你怎么想的字段进行排序。 – Starx 2010-12-15 09:43:21

+0

这并不是100%清楚你想要得到什么结果。也许试着说清楚你实际上想做什么。 – Josh 2013-03-08 03:25:20

+0

但是如果我想要“按顺序”去自然顺序呢? – 2015-01-22 09:42:13

回答

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

这实际上适用于我。它比基于子查询的解决方案少得多,但速度更快。 – 2016-06-26 11:19:27

+3

无法保证“NAME”列与“MAX(TIME)”位于同一行。鉴于上述数据或小数据集,它可能工作得很好,但绝不可靠。有关详细的讨论,请参阅http://stackoverflow.com/questions/14770671/mysql-order-by-before-group-by?noredirect=1#comment63515985_14770671 – 2016-06-27 07:55:41

+0

这是工作!似乎只有'ORDER BY'子句可以接受'SELECT'子句中的别名,这是一个不错的诀窍。 – JasonMing 2017-12-27 07:22:40

0

那么,你必须决定你想看到的ID和组后的时间字段。作为一个例子,我将选择MAX(ID)和SUM(时间),然后按总时间降序排序。

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

希望这有助于。

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