我想我在标题中总结得很好。我想从特定时间到另一个特定时间选择在线用户。我的表看起来像这样:
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
在线用户的查询。因此查询不会返回相同的值。这个我不知道该怎么做。
答案 0 :(得分:71)
第一次查询:
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约束来强制执行该操作)。
如果用户名可以在表格中出现多次,您只需要在SELECT之后为第一个查询添加DISTINCT,但是对于第二个查询,您需要稍微不同的方法:
SELECT DISTINCT username
FROM online
WHERE time > NOW() - INTERVAL 60 MINUTE
AND NOT EXISTS
(
SELECT *
FROM online
WHERE time > NOW() - INTERVAL 15 MINUTE
)
答案 1 :(得分:18)
使用DATE_SUB从NOW()返回的DATETIME中减去时间:
SELECT o.*
FROM ONLINE o
WHERE o.time >= DATE_SUB(NOW(), INTERVAL 15 MINUTE)
SELECT o.*
FROM ONLINE o
WHERE o.time BETWEEN DATE_SUB(NOW(), INTERVAL 60 MINUTE)
AND DATE_SUB(NOW(), INTERVAL 15 MINUTE)
额外重复处理成本。