Mysql 计算用户会话的数量

Mysql 计算用户会话的数量,mysql,sql,Mysql,Sql,我有一个带有ip和查看日期的表,以及带有网站id的网站 +------------+-----------+---------------------+ | website_id | ip | view_date | +------------+-----------+---------------------+ | 123 | 123123123 | 2014-01-01 10:23:00 | +------------+-----------+

我有一个带有ip和查看日期的表,以及带有网站id的网站

+------------+-----------+---------------------+
| website_id | ip        | view_date           |
+------------+-----------+---------------------+
| 123        | 123123123 | 2014-01-01 10:23:00 |
+------------+-----------+---------------------+
| 123        | 987987987 | 2014-01-01 10:23:00 |
+------------+-----------+---------------------+
| 123        | 123123123 | 2014-01-01 10:26:00 |
+------------+-----------+---------------------+
| 123        | 987987987 | 2014-01-01 10:24:00 |
+------------+-----------+---------------------+
| 123        | 987987987 | 2014-01-01 10:25:00 |
+------------+-----------+---------------------+
| 123        | 123123123 | 2014-01-02 03:23:00 |
+------------+-----------+---------------------+
我想从表中获取会话,这将是一个有人开始在网站上,直到他们完成的时间。若要了解何时完成这些操作,请在“查看日期”按顺序显示时,在两个查看日期之间的其中一个日期后30分钟或更长时间内没有活动

因此,通过这个示例数据,我有两个用户123123和987987987

用户123123有2个会话,因为第3行发生在第1行的30分钟内,第6行发生在第3行的30分钟后 用户987987987有1个会话,因为第4行发生在第2行之后不到30分钟,第5行发生在第4行之后不到30分钟 我不知道如何使用MySQL计算。我所知道的只是将数据按ip排序,然后按查看日期排序。从那以后我就迷路了

当我说会话时,我的意思是:

专门从事某项活动的一段时间

而不是:

在多个网页之间跟踪人员的一种方法

期望输出:

+------------+-----------+----------+
| website_id | ip        | sessions |
+------------+-----------+----------+
| 123        | 123123123 | 2        |
+------------+-----------+----------+
| 123        | 987987987 | 1        |
+------------+-----------+----------+

根据时间和IP进行排序后,可以使用游标查找会话总数。您可以从中获得有关mysql游标的更多信息

更多详情:

CREATE PROCEDURE curdemo()
BEGIN
  DECLARE done INT DEFAULT FALSE;
  DECLARE i INT;
  DECLARE prev_i INT;
  DECLARE d DATE;
  DECLARE prev_d DATE;
  DECLARE cur1 CURSOR FOR SELECT ip, view_date FROM table;
  DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;

  OPEN cur1;

  read_loop: LOOP
    IF prev_i == NULL THEN
        FETCH cur1 INTO prev_i, prev_d;
    END IF;
    FETCH cur1 INTO i, d;
    IF done THEN
      LEAVE read_loop;
    END IF;
    IF prev_i == i && INTERVAL_BETWEEN(prev_d, d) > 30min THEN
      ADD_IN_SESSIONS_FOR_i ;
    END IF;
    prev_i = i;
    prev_d = d;
  END LOOP;

  CLOSE cur1;
END;
现场观看它的工作 阅读有关用户定义的更多信息 这是我的解决办法

我做了一个计数,以找出一个给定的网站id和ip地址在日期和日期之间出现的行数-30分钟。如果它的0指定一个1意味着它是一个新会话,否则给它一个0。然后做一个总数


这个表结构已经在工作了吗?您现在正在收集数据吗?是的,我有数百万行。所需的输出是什么?你能举个例子吗?@JChao好的,我已经更新了问题,请看你的问题是,你没有会话开始的标识符。。。如中所示,需要有另一个列来标识新会话的开始日期…该列不提供问题的答案。请添加更多信息。这也是一个仅链接的答案
SET @a := null;
SET @b := null;
SET @c := null;
SELECT website_id, ip, view_date, COUNT(counting) as num_sessions
FROM
(   SELECT website_id, ip, view_date, 
        @c := if(@a = ip AND @b BETWEEN view_date - interval 30 minute AND view_date, @c + 1, 1) as counting, 
        @a := ip, @b := view_date
    FROM
    (   SELECT * 
        FROM sessions
        ORDER BY ip, view_date
    )t
)t1
WHERE counting = 1
GROUP BY ip;
select ip, sum(session) + 1 as session
from (
    select
    t.*,
    if(@previp = ip and timestampdiff(minute, @prevview, view_date) >= 30, 1, 0) as session,
    @previp := ip,
    @prevview := view_date
    from
    Table1 t
    , (select @prevview := (select view_date from Table1 order by ip, view_date limit 1), 
       @previp := null) var_init_subquery
    order by ip, view_date
) sq
group by ip
select website_id,
    ip,
    sum(newSession) as Sessions
from
(select *,
case 
    when (select count(*) 
          from yourTable ytb 
          where ytb.website_id = yta.website_id 
          and ytb.ip = yta.ip 
          and ytb.view_date < yta.view_date 
          and ytb.view_date > date_add(yta.view_date, INTERVAL -30 MINUTE)) = 0 then 1
    else 0
end as newSession
from yourtable yta) baseTable
GROUP BY website_id, ip