2012-04-13 61 views
0

我有一個表結構,如:SQL:按時間排序A組和限制結果

Name Time 

Joe  2012-02-22 22:11:26.0 
Joe  2012-02-22 21:01:23.0 
Sue  2012-02-22 20:57:10.0 
john 2012-02-22 18:13:36.0 
Fred 2012-02-22 16:56:57.0 
Joe  2012-02-22 14:38:45.0 
Joe  2012-02-22 14:38:45.0 
Ralph 2012-02-22 14:26:20.0 
...  ... 
(more Names and Times) 
...  ... 
john 2010-03-10 15:27:39.0 
john 2010-03-10 15:46:59.0 

我要找的前3名按時間排序。因此,結果將是:

Joe, Sue, john 

我開始喜歡一個查詢:

SELECT Name FROM table ORDER BY LOWER(TIME) DESC

,所以我想限制與結果:

SELECT Name FROM table ORDER BY LOWER(TIME) DESC LIMIT 0 , 3

但結果顯示前3行:

Joe, Joe, Sue 

現在我的名字試圖組查詢第一:

SELECT Name FROM table GROUP BY Name ORDER BY LOWER(TIME) DESC LIMIT 0 , 3 

是的,讓我3點不同的名稱,但在不可再現的順序。 我在這裏錯過了什麼嗎?這裏的正確語法是什麼?

回答

2
SELECT DISTINCT Name 
FROM table 
ORDER BY Time DESC 
LIMIT 3 

因此,基本上,你只需要添加DISTINCT到您的第二個查詢 - 這讓MySQL只選擇唯一的值。沒有必要分組。 UPD:這是錯誤的,因爲ORDER BY將在DISTINCT之後應用,因爲在大多數情況下DISTINCT將使用GROUP BY

P.S.我不明白你爲什麼使用LOWER。該函數使字符串小寫。但是你沒有操作字符串,因爲第二列是DATETIME(我認爲)?

UPD:您應該使用分組,這裏有一個例子:

SELECT Name 
FROM table 
GROUP BY Name 
ORDER BY MAX(Time) DESC 
LIMIT 3 

在這裏,重要的是從每個組和秩序由取最大值的日期/時間。

+0

嘗試過。但也顯示不正確的名稱。是的,我不需要'LOWER'功能 – 2012-04-13 23:55:10

+0

這真的很奇怪。它顯示了什麼,你期望什麼? – 2012-04-13 23:56:08

+0

我更新了我的答案。如果它仍然不起作用,這意味着排序不能按預期工作。檢查該列是否有'DATETIME'類型。 – 2012-04-14 00:02:42