Mysql 如何计算sql中满足特定条件的循环数

Mysql 如何计算sql中满足特定条件的循环数,mysql,loops,session,count,Mysql,Loops,Session,Count,在MySQL数据库上,我有下表,它是客户的面板数据 用户|选项卡|操作|时间| 77-登录14071344 77用户信息视图1407171400 77交通选择1407171407 77-登录14071440 65-登录14071505 65更改选择1407564830 65变更工资1407579352 65-登录1407579442 65-登录1407579765 77-登录1407579866 77-登录1407680000 77推广银行1407171400 77晋升工资1408100946

在MySQL数据库上,我有下表,它是客户的面板数据

用户|选项卡|操作|时间| 77-登录14071344 77用户信息视图1407171400 77交通选择1407171407 77-登录14071440 65-登录14071505 65更改选择1407564830 65变更工资1407579352 65-登录1407579442 65-登录1407579765 77-登录1407579866 77-登录1407680000 77推广银行1407171400 77晋升工资1408100946 65交通选择1407171400 65交通费1408114734 65-登录1408125796
65服务扩展1408192741假设用户不能同时拥有多个会话, 如果他们这样做了,那么您需要使用第三个参数以不同的方式跟踪他们。 假设您的数据已经在表user_action中,并且当前 它看起来像:

SELECT  user,action,time  FROM user_action  order by user, time;
user    activity    time
65  select      1407171400
65  login       1407171505
65  select      1407564830
65  pay         1407579352
65  login       1407579442
65  login       1407579765
65  pay         1408114734
65  login       1408125796
65  extend      1408192741
77  login       1407171344
77  bank        1407171400
77  view        1407171400
77  select      1407171407
77  login       1407171440
77  login       1407579866
77  login       1407680000
77  pay         1408100946
复制按用户排序的记录,然后按时间排序 ,使用新列活动编号->进入新的临时表进行分析

每个客户的最后一个会话可能没有表示会话结束的登录记录,因此我们为每个客户在会话结束时添加一个登录行

DROP TABLE IF EXISTS user_action_temp;
SET @activity_number := 0;
CREATE TABLE  user_action_temp
AS 
SELECT @activity_number := @activity_number + 1 AS activity_number, user, action, time
FROM
(SELECT  user,action,time  FROM user_action 
UNION SELECT user,'login' as action,max(time)+1 as time  FROM user_action GROUP BY user) AS USER_ACTIVITY
ORDER BY user, time;
您的数据现在看起来像:

select * From user_action_temp order by user, time;
activity_number user    action      time
1       65  select      1407171400
2       65  login       1407171505
3       65  select      1407564830
4       65  pay         1407579352
5       65  login       1407579442
6       65  login       1407579765
7       65  pay         1408114734
8       65  login       1408125796
9       65  extend      1408192741
10      65  login       1408192742
11      77  login       1407171344
12      77  bank        1407171400
13      77  view        1407171400
14      77  select      1407171407
15      77  login       1407171440
16      77  login       1407579866
17      77  login       1407680000
18      77  pay         1408100946
19      77  login       1408100947
接下来,自行连接此表 让我们定义两个变量来设置每个登录活动的登录号

SET @login_number1:=0;
SET @login_number2:=0;
自联接表1中登录号上的表与表2中的下一个登录匹配,用户保持不变。 活动计数是两次登录之间的活动总数

SELECT * FROM
(
SELECT logins_1.user,
logins_1.time as session_start,
logins_2.time as session_end, 

case when (logins_2.activity_number -logins_1.activity_number )>1 
then (logins_2.activity_number -logins_1.activity_number - 1) else 0 end  
as activity_count

FROM
    (SELECT @login_number1 := @login_number1 + 1 AS login_number, 
    activity_number, user, action, time 
    FROM user_action_temp 
    WHERE action='login' 
    ORDER BY user, time) AS logins_1
LEFT OUTER JOIN
    (SELECT @login_number2 := @login_number2 + 1 AS login_number2,
     activity_number, user, action, time  
    FROM user_action_temp 
    WHERE action='login' 
    ORDER BY user, time) AS logins_2
on logins_1.login_number = (logins_2.login_number2-1) 
and logins_1.user = logins_2.user

) AS RESULT;
其中提供了所有用户会话的摘要:

user    session_start   session_end activity_count
65  1407171505  1407579442  2
65  1407579442  1407579765  0
65  1407579765  1408125796  1
65  1408125796  1408192742  1
65  1408192742  <null>  0
77  1407171344  1407171440  3
77  1407171440  1407579866  0
77  1407579866  1407680000  0
77  1407680000  1408100947  1
77  1408100947  <null>  0

您可以使用WHERE activity\u count>0筛选上述查询,以获得所需内容。

I want I want I want I want。因此,这不是免费的编码服务,我们在这里帮助您解决代码中的问题。您必须尝试,发布您尝试过的内容,我们将向您展示错误的地方。我们尝试编写循环并在web上搜索,包括此网站,我们意识到可能在sql中不可能建立索引。到目前为止失败了。如果我们知道如何开始,如果我们确信有一种方法可以在sql中重新编码,我们将向您展示代码。那么有没有一种方法呢?您不需要在SQL中编写循环,而是编写连接或使用分组方式。非常感谢。您还以获得输出的方式回答了我们的其他问题!因为我们还想计算每个会话中的具体操作……我们正在尝试,如果有错误,我们将发布错误。