2011-10-04 83 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