2011-10-04 86 views
2

我可能會在這裏簡單化了我的問題:How to use MAX in MySQL?獲取最後的日誌條目

考慮到用戶的日誌表:

TABLE: user_log 
- user_log_id (PK) 
- user_id (FK) 
- status 
- timestamp 

我需要什麼:所有用戶的最後一個用戶的日誌條目,是有一定的status,至少15分鐘。如果用戶的最新日誌條目爲特定狀態並且時間爲15分鐘,則需要在我的應用程序中執行某些操作。

我該如何查詢?

回答

0

假設timstampdatetime類型,user_id,timestamp獨特

SELECT a.* 
FROM user_log a 
INNER JOIN 
(SELECT user_id, MAX(`timestamp`) as ts FROM 
user_log b WHERE timestamp <= NOW()-interval 15 MINUTE 
GROUP BY user_id)b 
ON (b.user_id = a.user_id AND a.`timestamp` = b.ts) 

如果user_log_id是自動遞增,您可以選擇MAX(user_log_id),而不是`MAX(時間戳)。

+0

a1ex07,SQL是否正確?應該'是'嗎? – StackOverflowNewbie

+0

'AS'是可選的。 –

+0

'AS'是可選的。我不想將它與表/派生表別名一起使用,但總是與字段別名一起使用。 – a1ex07

1

怎麼辦?

select * from user_log 
where timestamp in (select max(timestamp) from user_log) 
and status = 'certain' 
and timestamp > DATE_SUB(now(), INTERVAL 15 MINUTE) 
0

你需要做的「兩個查詢」,以獲得在每個用戶的基礎上

第一部分是讓每個用戶的最後一個條目的最後一個條目,第二個是要獲取數據該條目:

SELECT * FROM user_log u 
INNER JOIN (
    SELECT MAX(user_log_id) as user_log_id, user_id 
    FROM user_log 
    WHERE TIMEDIFF(NOW(), timestamp) <= '00:15:00' 
    GROUP BY user_id 
) as a 
ON u.user_log_id = a.user_log_id 
0

這將顯示僅他們最後的時間戳是至少15分鐘,老和狀態@a_certain_status用戶。如果您想查找用戶15分鐘前的日誌具有該狀態(忽略最近15分鐘內的任何日誌,無論這些日誌中的狀態如何),請使用@ a1ex07的答案。

SELECT ul.* 
FROM user_log AS ul 
    JOIN 
     (SELECT user_id 
      , MAX(`timestamp`) as maxts 
     FROM user_log 
     GROUP BY user_id 
     HAVING MAX(`timestamp`) <= NOW() - INTERVAL 15 MINUTE 
    ) AS ulg 
    ON ulg.user_id = ul.user_id 
    AND ulg.maxts = ul.`timestamp` 
WHERE ul.status = @a_certain_status