Получить последнюю запись в журнале - PullRequest
2 голосов
/ 05 октября 2011

Я мог бы упростить мою проблему здесь: Как использовать MAX в MySQL?

Учитывая таблицу журнала пользователя:

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

Что мне нужно:самая последняя запись в журнале всех пользователей с определенным значением status и возрастом не менее 15 минут.Если последняя запись в журнале пользователя имеет определенный статус и ей 15 минут, мне нужно выполнить определенные действия в моем приложении.

Как мне сделать запрос?

Ответы [ 4 ]

1 голос
/ 05 октября 2011

А как же?

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 голосов
/ 05 октября 2011

Это покажет вам только тех пользователей, чья последняя отметка времени не менее 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
0 голосов
/ 05 октября 2011

Вам нужно выполнить "два запроса", чтобы получить последнюю запись для каждого пользователя

Первая часть - это получение последней записи для каждого пользователя, а вторая - получение данных для этой записи:

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 голосов
/ 05 октября 2011

Предполагается, что 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 (отметка времени).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...