Подтвердить что ты не робот

Выберите из таблицы 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. Таким образом, запрос не возвращает те же значения. Это я не знаю, как это сделать.

4b9b3361

Ответ 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) 

Дублируйте дополнительные затраты на обработку.