我有相当大的数据库,但为了这个问题,我已经简化了它:
基本上,每当用户点击我网站上的内容时,它都会在我的数据库中记录为一行:UserID
字段是用于标识用户的Cookie,Stuff
和MoreStuff
是有关点击的数据。请注意,显然,这些可能每次都不同," Foo"和" Bar"只是一种表现形式。
我想要做的是:使用SQL查询,过滤掉所有首次访问或所有重复访问(我假设如果我可以做一个,我可以反转我的过滤器为另一个)。所以,如果我要过滤掉我的样本中的所有重复访问,我就会得到这个:
绿色代表所选行,红色代表被拒绝的行。
如何只用SQL做到这一点?
答案 0 :(得分:3)
您可以使用group by
和min(timestamp)
表执行此操作。然后将其放在视图或临时别名表中并加入。
示例 - 获取首次访问时间戳:
SELECT userID,
min(TIMESTAMP)
FROM info
GROUP BY userID
示例 - 获取所有信息:
SELECT *
FROM info t,
(SELECT userID,
min(TIMESTAMP) as timestamp
FROM info
GROUP BY userID) AS t2
WHERE t.userID = t2.userID
AND t.TIMESTAMP = t2.TIMESTAMP;
SQLFiddle:http://sqlfiddle.com/#!2/6fd238/3
答案 1 :(得分:2)
如果您只是想要第一次访问:
select t.*
from table t
where not exists (select 1
from table t2
where t2.id = t.id and t2.timestamp < t.timestamp
);
这说:“从表格中获取所有行,其中没有行具有相同的id
和更小的timestamp
”。这相当于为每个id获取最小值。
为了提高性能,您需要table(id, timestamp)
上的索引。
答案 2 :(得分:0)
您可以使用聚合函数COUNT()
,然后使用HAVING
语句,如:
SELECT userID, COUNT(userID)
FROM tbl
GROUP BY userID
HAVING COUNT(userID) >= 2
如果您想过滤掉重复访问者,可以重新使用上述查询:
SELECT * FROM tbl
WHERE EXISTS
(
SELECT userID, COUNT(userID)
FROM tbl
GROUP BY userID
HAVING COUNT(userID) >= 2
)
GROUP BY userID
如果您想查看首次访问者,可以将HAVING COUNT(userID) >= 2
更改为HAVING COUNT(userID) = 1
,或者当然而不是EXISTS
使用NOT EXISTS
。
参见 Demo