2013-05-09 100 views
1

我試圖在stackoverflow上搜索google。我主要看到,我們使用最大。但是,在我的記錄中,它將成千行,所以它會在完成之前吃掉很多時間。Mysql通過datetime或unixtime獲取用戶多行記錄的最新記錄

基本上,我只是想通過datetime或unixtime獲取最新的記錄。

表中的記錄,通過日期時間ASC排序:

查詢:SELECT * FROM佔ORDER BY日期時間ASC;

+----------+--------+---------------------+------------+ 
| user_id | status | datetime   | unixtime | 
+----------+--------+---------------------+------------+ 
| 14254047 |  1 | 2013-03-27 01:25:12 | 1364343912 | 
| 14254270 |  1 | 2013-03-27 09:36:58 | 1364373418 | 
| 14254619 |  1 | 2013-03-27 16:07:04 | 1364396824 | 
| 14254047 |  0 | 2013-05-08 07:20:39 | 1367990439 | 
| 14254270 |  0 | 2013-05-09 04:01:36 | 1368064896 | 
| 14254619 |  0 | 2013-05-09 04:01:36 | 1368064896 | 
+----------+--------+---------------------+------------+ 

當我通過USER_ID分組它們,結果總是顯示的第一條記錄。不是最新的,由datetime或unixtime DESC甚至添加順序

查詢:按日期時間DESC USER_ID爲了SELECT * FROM帳戶組;

+----------+--------+---------------------+------------+ 
| user_id | status | datetime   | unixtime | 
+----------+--------+---------------------+------------+ 
| 14254047 |  1 | 2013-03-27 01:25:12 | 1364343912 | 
| 14254270 |  1 | 2013-03-27 09:36:58 | 1364373418 | 
| 14254619 |  1 | 2013-03-27 16:07:04 | 1364396824 | 
+----------+--------+---------------------+------------+ 

我想要的結果如下:

+----------+--------+---------------------+------------+ 
| user_id | status | datetime   | unixtime | 
+----------+--------+---------------------+------------+ 
| 14254047 |  0 | 2013-05-08 07:20:39 | 1367990439 | 
| 14254270 |  0 | 2013-05-09 04:01:36 | 1368064896 | 
| 14254619 |  0 | 2013-05-09 04:01:36 | 1368064896 | 
+----------+--------+---------------------+------------+ 

什麼可能是最好的方法,不使用MAX()?

問候

回答

0

正確的方法做,這是使用連接:

select a.* 
from accounts a join 
    (select user_id, max(datetime) as maxdt 
     from accounts 
     group by user_id 
    ) asum 
    on asum.user_id = a.user_id and a.datetime = asum.maxdt 
order by datetime DESC; 

你原來的查詢使用MySQL的擴展,你可以有select條款來看,這是不是在group by列子句(或在聚合函數中)。當你這樣做時,MySQL明確表示值爲而不是確定。他們有時可能來自第一行,但這種行爲不能保證。

+0

最多是否應始終使用?它需要一段時間才能完成上千行。 – 2013-05-09 02:20:15

+0

@LouieMiranda。 。 。可能有其他的替代公式使用'存在',但它會是相同的想法。一千行不是很多行,所以性能應該不是什麼大問題,除非你每秒鐘多次運行這個查詢。 – 2013-05-09 02:22:47

1

與大多數自動增量情況一樣,max(ID)實際上是最近記錄的更好指標,然後max(datetime)是。這是因爲獨特的自動增量功能是同一時間記錄中的決勝因素。

更好的是,那裏有很多可能已經在自動增量列上有一個索引,所以如果可以的話使用這個。

的告誡是:

  1. 你喜歡的準確性和關心數據的質量,你關心的項目創建的相對時間
  2. 。如果對日期時間的修改是可能的並且是期望的,那麼您使用日期時間列。
  3. 您的帳戶表中有一個自動增量列(如上面描述的ID)。 select *表示你不會那麼糟糕。但你可以添加一個!

查詢。我打電話給在這上面的查詢accounts.idID柱:

select a.* 
from accounts a join 
    (select user_id, max(id) as maxid 
    from accounts 
    group by user_id 
    ) asum 
    on asum.user_id = a.user_id and a.id = asum.maxid 
order by a.id DESC; 
+0

datetime是我的標準的一部分的原因是,有一些後期/將來的記錄,如果修改,將ID作爲無效。 – 2013-05-09 04:53:24

+0

這很好,也許這會幫助別人誰可以使用一個ID。僅供參考,問題中的select *表示賬戶中沒有「ID」。 – gillyspy 2013-05-10 14:06:11

0

我在同樣的問題stucked,我得到了我的解決方案解決方案通過提供Oliver Hanappi