【发布时间】:2011-04-01 06:26:58
【问题描述】:
假设我有一个记录传入用户的表,其中每个用户都有一个 IP 地址 (ipaddr)。
选择以前从未访问过该网站的所有用户的最佳方法是什么? (因此特定的 IPADDR 值只存在于表 once 中),但是我只想知道过去 6 小时内的新访客。
我基本上想在 SQL 中做这样的事情:
SELECT * from visitors GROUP BY ipaddr WHERE COUNT(ipaddr) = 1 and date > '2011-03-31 00:59:11'
但是,DATE 条件应该只适用于结果,而不是用于检查访问者是否是新的。
更新:
有一个 SID 字段用于说明用户浏览会话。
以下是相关的表架构:
CREATE TABLE `visitors` (
`date` timestamp NOT NULL default CURRENT_TIMESTAMP,
`sid` bigint(12) unsigned NOT NULL,
`ipaddr` int(8) NOT NULL,
)
一些示例数据:
INSERT INTO `visitors` (`date`,`sid`, `ipaddr`)
VALUES
('2011-03-31 06:25:48', 299521885457, -1454342140);
INSERT INTO `visitors` (`date`,`sid`, `ipaddr`)
VALUES
('2011-03-31 06:26:37', 299521885457, -1454342140);
INSERT INTO `visitors` (`date`,`sid`, `ipaddr`)
VALUES
('2010-01-01 15:23:44', 694387538590, -1454342140);
此访问者有两行实时发生的当前会话,每一行是他访问过的每个页面(仅显示相关架构)。最后显示的示例行是 2010 年的访问,这意味着该 IP 地址有 2 个不同的 SID 属于它,因此不是新访问者。
查询的结果应该没有上面列出的任何行,因为这个访问者在数据库中有两个会话。如果最后一行被删除(sid 694387538590),访问者应该成为新访问者并出现在查询中。
【问题讨论】:
标签: mysql optimization