Mysql 如何计算sql中满足特定条件的循环数
在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-登录1408125796Mysql 如何计算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
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中编写循环,而是编写连接或使用分组方式。非常感谢。您还以获得输出的方式回答了我们的其他问题!因为我们还想计算每个会话中的具体操作……我们正在尝试,如果有错误,我们将发布错误。