mysql - 如何知道页面访问是否按预期顺序发生?

标签 mysql sql

假设我有一个表,其中包含用户 session 、他们在该 session 中访问的页面以及这些页面访问的日期时间。用户应该以正确的顺序访问页面 - 也就是说,他们不应该先浏览第 3 页才能到达第 2 页。

这里(用户 1, session 1)是一个“好” session ,因为她以正确的顺序访问了所有页面。

user_id  session_id  page_id  event_dt
1        1           1        2017-07-04 17:54:40
1        1           2        2017-07-04 17:54:43
1        1           3        2017-07-04 17:54:44

但是(用户 2, session 2)是一个“糟糕的” session ,因为她设法在第 1 页之前以某种方式登陆第 2 页

user_id  session_id  page_id  event_dt
2        2           2        2017-07-04 17:54:47
2        2           1        2017-07-04 17:54:49
2        2           3        2017-07-04 17:54:50

如何使用 SQL 查询确定(用户 1, session 1)是“好” session ,而(用户 2, session 2)是“坏”路径。

附录

我按照 Degan 的建议添加了一个新的 event_dt 列在下面的评论中。

此外,我正在寻找使用 MySQL 的查询,尽管我也希望看到使用 SQL Server(或任何其他包含窗口函数的实现)的查询。

最佳答案

您可以枚举页面两次,一次按页面顺序,一次按日期顺序。然后比较它们:

select t.*
from (select t.*,
             (@rn := if(@us = concat_ws(user_id, session_id), @rn + 1,
                        if(@us := concat_ws(user_id, session_id), 1, 1)
                       )
             ) as rn_p
      from (select t.*,
                   (@rn := if(@us = concat_ws(user_id, session_id), @rn + 1,
                              if(@us := concat_ws(user_id, session_id), 1, 1)
                             )
                   ) as rn_e
            from t cross join
                 (select @us := '', @rn := 0) params
            order by user_id, session_id, event_dt
           ) t cross join
           (select @us := '', @rn := 0) params
      order by user_id, session_id, page_id
     ) t
where rn_e <> rn_p;

关于mysql - 如何知道页面访问是否按预期顺序发生?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44915234/

相关文章:

php - 从 SELECT * FROM $table 中排除一个字段

mysql - 按不同年级分组并知道他们是多少年级

sql - 如何更改存储在 S3 中的 Athena 结果的名称?

sql - mysql 中 REGEXP_SUBSTR 的等价物是什么?

sql - 从 sql 表中动态选择不同的当前列和以前的列

mysql - 更改 MySQL 中的隔离级别 (Windows)

mysql - SQL - 我可以在每列中添加单词吗?

sql - 如果事件每 X 分钟发生一次以上,则仅对事件计数一次

php - 500 内部服务器错误 PHP 超时

PHP 从当前月份选择数据库行并使用 foreach() 显示它们