Выберите из таблицы mysql между datetime x min ago и datetime x мин назад
Думаю, я хорошо ее подытожил в названии. Я хочу выбрать онлайн-пользователей с определенного времени до другого определенного времени. Моя таблица выглядит так:
CREATE TABLE online (
id bigint(20) NOT NULL auto_increment,
`username` varchar (16) NOT NULL,
`ip` varchar(39) NOT NULL default '',
`time` datetime NOT NULL default '0000-00-00 00:00:00' ,
PRIMARY KEY (id)
);
Мне нужен запрос, возвращающий username
, который был в сети last 15 minutes
.
И запрос для пользователей, которые были в сети last 60 minutes, but not the last 15 minutes
. Таким образом, запрос не возвращает те же значения. Это я не знаю, как это сделать.
Ответы
Ответ 1
Для вашего первого запроса:
SELECT username
FROM online
WHERE time > NOW() - INTERVAL 15 MINUTE
И для вашего второго:
SELECT username
FROM online
WHERE time BETWEEN NOW() - INTERVAL 60 MINUTE AND NOW() - INTERVAL 15 MINUTE
Оба этих запроса предполагают, что каждый пользователь появляется только один раз в онлайн-таблице (и если это действительно так, вы должны добавить ограничение UNIQUE, чтобы обеспечить его выполнение).
Если имя пользователя может появляться более одного раза в таблице, вам просто нужно добавить DISTINCT после SELECT для вашего первого запроса, но вам нужен немного другой подход для вашего второго запроса:
SELECT DISTINCT username
FROM online
WHERE time > NOW() - INTERVAL 60 MINUTE
AND NOT EXISTS
(
SELECT *
FROM online
WHERE time > NOW() - INTERVAL 15 MINUTE
)
Ответ 2
Используйте DATE_SUB для вычитания времени из DATETIME, возвращенного с помощью NOW():
последние 15 минут
SELECT o.*
FROM ONLINE o
WHERE o.time >= DATE_SUB(NOW(), INTERVAL 15 MINUTE)
последние 60 минут, но не последние 15 минут
SELECT o.*
FROM ONLINE o
WHERE o.time BETWEEN DATE_SUB(NOW(), INTERVAL 60 MINUTE)
AND DATE_SUB(NOW(), INTERVAL 15 MINUTE)
Дублируйте дополнительные затраты на обработку.