在数据库中分隔新用户和返回用户

时间:2014-07-09 12:16:11

标签: mysql sql database

我有相当大的数据库,但为了这个问题,我已经简化了它:

A sample chunk of my DB

基本上,每当用户点击我网站上的内容时,它都会在我的数据库中记录为一行:UserID字段是用于标识用户的Cookie,StuffMoreStuff是有关点击的数据。请注意,显然,这些可能每次都不同," Foo"和" Bar"只是一种表现形式。

我想要做的是:使用SQL查询,过滤掉所有首次访问或所有重复访问(我假设如果我可以做一个,我可以反转我的过滤器为另一个)。所以,如果我要过滤掉我的样本中的所有重复访问,我就会得到这个:

The filtered DB

绿色代表所选行,红色代表被拒绝的行。

如何只用SQL做到这一点?

3 个答案:

答案 0 :(得分:3)

您可以使用group bymin(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