我可能会在这里简单化了我的问题:How to use MAX in MySQL?获取最后的日志条目
考虑到用户的日志表:
TABLE: user_log
- user_log_id (PK)
- user_id (FK)
- status
- timestamp
我需要什么:所有用户的最后一个用户的日志条目,是有一定的status
,至少15分钟。如果用户的最新日志条目为特定状态并且时间为15分钟,则需要在我的应用程序中执行某些操作。
我该如何查询?
我可能会在这里简单化了我的问题:How to use MAX in MySQL?获取最后的日志条目
考虑到用户的日志表:
TABLE: user_log
- user_log_id (PK)
- user_id (FK)
- status
- timestamp
我需要什么:所有用户的最后一个用户的日志条目,是有一定的status
,至少15分钟。如果用户的最新日志条目为特定状态并且时间为15分钟,则需要在我的应用程序中执行某些操作。
我该如何查询?
假设timstamp
为datetime
类型,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(时间戳)。
怎么办?
select * from user_log
where timestamp in (select max(timestamp) from user_log)
and status = 'certain'
and timestamp > DATE_SUB(now(), INTERVAL 15 MINUTE)
你需要做的“两个查询”,以获得在每个用户的基础上
第一部分是让每个用户的最后一个条目的最后一个条目,第二个是要获取数据该条目:
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
这将显示仅他们最后的时间戳是至少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
a1ex07,SQL是否正确?应该'是'吗? – StackOverflowNewbie
'AS'是可选的。 –
'AS'是可选的。我不想将它与表/派生表别名一起使用,但总是与字段别名一起使用。 – a1ex07