我可能會在這裏簡單化了我的問題: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