2011-10-04 2 views
2

마지막 로그 : How to use MAX in MySQL?받기 내가 여기 내 문제를 과도하게 단순화 수도 항목

을 감안할 때 사용자의 로그 테이블 :

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

내가 필요한 것 : 특정 모든 사용자의 매우 마지막 사용자 로그 항목을 status이며 최소한 15 분이 경과해야합니다. 사용자의 최신 로그 항목이 특정 상태이고 15 분이 지난 경우 응용 프로그램에서 특정 작업을 수행해야합니다.

어떻게 쿼리합니까? timstamp 가정

답변

0

datetime 유형 및 user_id,timestamp 독특한 user_log_id가 자동 증가 인 경우

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) 

, 대신`MAX (타임 스탬프)의 MAX(user_log_id)를 선택할 수 있습니다.

+0

a1ex07은 SQL입니다. b는 AS b이어야합니까? – 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