2015-09-08 106 views
2

我有如下表:選擇通過最新的時間戳

 
+-------+--------+---------------------+ 
| score | user |  scrap_time  | 
+-------+--------+---------------------+ 
| 200 | Bob | 2015-09-08 11:46:17 | 
+-------+--------+---------------------+ 
| 210 | Alice | 2015-09-08 11:46:17 | 
+-------+--------+---------------------+ 
| 240 | Bob | 2015-09-08 11:48:00 | 
+-------+--------+---------------------+ 
| 260 | Alice | 2015-09-08 11:48:01 | 
+-------+--------+---------------------+ 

我想所有的分數每個用戶是有最新scrap_time而忽略了舊的。

例子:

 
+-------+--------+---------------------+ 
| score | user |  scrap_time  | 
+-------+--------+---------------------+ 
| 240 | Bob | 2015-09-08 11:48:00 | 
+-------+--------+---------------------+ 
| 260 | Alice | 2015-09-08 11:48:01 | 
+-------+--------+---------------------+ 


我一直在試圖想出一個查詢,像這樣的:

select * from scores where date(scrap_time) = (select max(scrap_time) from scores); 

但是,這並沒有給我我需要的結果。

+1

怎麼會把'Bob'也包含在預期中結果集? –

+0

因爲我需要每個用戶的最後一個分數 – Zibar

+0

'select score,max(scrap_time),user from scores' – Saty

回答

2

首先,你需要找到MAX(scrap_time)每用戶,然後找到那些行

SELECT * FROM scores WHERE (user,scrap_time) IN (
SELECT user,MAX(scrap_time) scrap_time FROM scores 
GROUP BY user); 
2

您需要獲得MAX(scrap_time)user,然後只需返回到您的表以獲得所需的結果集。像下面這樣的東西應該工作:

SELECT s.score, s.user, s.scrap_time 
FROM scores AS s 
INNER JOIN (SELECT user, max(scrap_time) AS maxTime 
      FROM scores 
      GROUP BY user) AS t 
ON s.user = t.user AND s.scrap_time = maxTime 

Demo here

0

使用max函數與GROUP BY這將提供你最近每次得分的時間

select score, user, max(scrap_time) 
from  scores 
group by score;