2010-04-06 34 views
2

說我有以下領域的 'USER_LOG' 表:MySQL:我怎樣才能選擇每個用戶的最後更新?

  • ID
  • USER_ID
  • STATUS_TEXT
  • 時間戳

我怎麼寫,只有選擇查詢最後一次更新該表中的所有用戶?如果你想成爲真正的迂腐正確的,覆蓋所有的角落例(多

SELECT * 
FROM user_log 
INNER JOIN 
(SELECT MAX(id) as id FROM user_log GROUP BY user_id) last_updates 
ON last_updates.id = user_log.id 

感謝您的幫助:)

+0

您是否只想要user_id和date或任何支持行? – 2010-04-06 20:36:36

+0

在user_id,timestamp上是否存在唯一約束? – 2010-04-06 20:36:49

回答

4

假設ID是自動遞增的ID,你可以這樣做具有相同時間戳更新,亂序插入等),您可以使用時間戳:

SELECT * 
FROM user_log 
INNER JOIN 
(SELECT MAX(id) 
FROM user_log 
INNER JOIN 
(SELECT DISTINCT user_id, MAX(timestamp) as timestamp 
    FROM user_log GROUP BY user_id 
) last_updates 
ON last_updates.user_id = user_log.user_id 
    AND last_updates.timestamp = user_log.timestamp 
) last_update 
ON last_update.id = user_log.id 
+0

你的第二個查詢給出了這個錯誤:'on子句'中未知列'last_udpates.user_id' – 2010-04-07 05:54:48

+0

@Mark - 對不起,是一個錯字。 'last_udpates'應該是'last_updates'。現在修復。 – 2010-04-07 13:07:15

+0

工程就像一個魅力!謝謝:) – KeyStroke 2010-04-07 19:39:26

1

用途:

SELECT ul.user_id, 
     MAX(ul.timestamp) 
    FROM USER_LOG ul 
GROUP BY ul.user_id 
-1

嘗試:

SELECT user_id, MAX(timestamp) FROM user_log GROUP BY user_id 
+0

這將爲每個用戶獲取最新的時間戳,但不能保證返回最新的status_text,這是OP想要的。 – michael 2016-07-22 22:30:15

-1

那是N-N關係?如果不是,則根據標準指南,status_text和timestamp應該被關係中最大的表所吸收。

如果沒有嘗試

SELECT id,MAX(timestamp) FROM user_log GROUP BY user_id; 
+0

這將爲每個用戶獲取最新的時間戳,但不能保證返回最新的status_text,這是OP所需的。 – michael 2016-07-22 22:30:20

0

如果你沒有一個唯一約束(user_id, timestamp)但你仍然要保證只有一個行每個用戶返回,那麼你可以使用此查詢:

SELECT id, user_id, status_text, timestamp 
FROM (
    SELECT *, @prev <> user_id AS is_newest, @prev := user_id 
    FROM user_log, (SELECT @prev := -1) AS vars 
    ORDER BY user_id, timestamp DESC, id DESC 
) AS T1 
WHERE is_newest 

結果:

1, 1, 'Foo', '2010-01-01 00:00' 
4, 2, 'Bar', '2010-01-01 01:00' 

測試數據:

CREATE TABLE user_log (id INT NOT NULL, user_id INT NOT NULL, status_text NVARCHAR(100) NOT NULL, timestamp NVARCHAR(100) NOT NULL); 
INSERT INTO user_log (id, user_id, status_text, timestamp) VALUES 
(1, 1, 'Foo', '2010-01-01 00:00'), 
(2, 1, 'Bar', '2010-01-01 00:00'), 
(3, 2, 'Foo', '2010-01-01 00:00'), 
(4, 2, 'Bar', '2010-01-01 01:00'); 
0

可以使用相關子查詢來獲取具有最近時間戳的記錄的標識。這應該工作,即使時間戳不是唯一的或ID沒有順序給出。

select 
    ul.id, 
    ul.user_id, 
    ul.status_text, 
    ul.timestamp 
from 
    user_log ul 
where 
    ul.id = (select top 1 ul2.id 
      from user_log ul2 
      where ul2.user_id = ul.user_id 
      order by ul2.timestamp desc)