mysql同一个表中如何根据不同的条件将查询到的记录放到一个结果集中

qwer20110711 2012-08-20 11:53:55
现有表如下:
id time is_login
3 2012-07-03 11:20:20 1
3 2012-07-03 11:25:20 0
3 2012-07-03 12:30:20 1
3 2012-07-03 12:20:50 0

is_login值等于1表示登录,等于0表示登出,那么如何通过一条sql语句查询出登录时间和登出时间呢?

我需要的是这样显示:
id login_ time logout_time
3 2012-07-03 11:20:20 2012-07-03 11:25:20
3 2012-07-03 12:20:20 2012-07-03 12:30:50
...全文
749 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
ACMAIN_CHM 2012-08-21
  • 打赏
  • 举报
回复
select * from xxx order by id, time

然后逐一记录匹配。
qwer20110711 2012-08-20
  • 打赏
  • 举报
回复
存储过程怎么写呢?
ACMAIN_CHM 2012-08-20
  • 打赏
  • 举报
回复
用SQL语句过于复杂,还是直接用存储过程或者程序比较方便高效。
qwer20110711 2012-08-20
  • 打赏
  • 举报
回复
ID ROLE_ID LOGIN_TIME IS_LOGIN_IN IP
1 100010102 2012/3/7 16:40:42 1 192.168.1.7
2 100010101 2012/3/7 16:42:06 1 192.168.1.105
3 100010101 2012/3/7 16:42:44 0
4 100010101 2012/3/7 16:43:12 1 192.168.1.105
5 100010101 2012/3/7 16:44:18 0
6 100010104 2012/3/7 16:44:24 1 192.168.1.105
7 100010102 2012/3/7 16:53:05 0
8 500010102 2012/3/7 16:53:47 1 192.168.1.7
9 500010102 2012/3/7 16:54:29 0
10 100010102 2012/3/7 16:54:32 1 192.168.1.7
11 100010102 2012/3/7 16:55:08 0
12 400010101 2012/3/7 16:55:40 1 192.168.1.7
13 400010101 2012/3/7 16:55:49 0
14 100010103 2012/3/7 16:55:51 1 192.168.1.7
15 100010103 2012/3/7 16:56:20 0
16 300010102 2012/3/7 17:05:08 1 192.168.1.36
17 100010102 2012/3/7 17:15:48 1 192.168.1.7
18 100010104 2012/3/7 17:48:55 0
19 300010102 2012/3/7 18:48:07 0
20 100010102 2012/3/7 19:07:54 0

按照上面2楼朋友的sql:
SELECT SQL_CALC_FOUND_ROWS ROLE_ID, SUM(UNIX_TIMESTAMP(LOGIN_TIME)) AS logout_stamp FROM im_log_head.`t_log_login` WHERE is_login_in = 0 AND date(login_time)= date('2012-03-07') GROUP BY ROLE_ID ORDER BY ROLE_ID;
查询得到以下结果:
100010101 2012/3/7 16:42:06 2012/3/7 16:42:44
100010101 2012/3/7 16:43:12 2012/3/7 16:44:18
100010102 2012/3/7 16:40:42 2012/3/7 16:42:44
100010102 2012/3/7 16:54:32 2012/3/7 16:55:08
100010102 2012/3/7 17:15:48 2012/3/7 17:48:55
100010103 2012/3/7 16:55:51 2012/3/7 16:56:20
100010104 2012/3/7 16:44:24 2012/3/7 16:53:05
300010102 2012/3/7 17:05:08 2012/3/7 17:48:55
400010101 2012/3/7 16:55:40 2012/3/7 16:55:49
500010102 2012/3/7 16:53:47 2012/3/7 16:54:29
发现第三条记录:100010102 2012/3/7 16:40:42 2012/3/7 16:42:44
后面的登出时间应该是2012-03-07 16:53:05
第五条记录后面登出时间应该是2012-03-07 19:07:54
所以好像sql语句上还存在问题啊!!!

qwer20110711 2012-08-20
  • 打赏
  • 举报
回复
1 100010102 2012/3/7 16:40:42 1
2 100010101 2012/3/7 16:42:06 1
3 100010101 2012/3/7 16:42:44 0
4 100010101 2012/3/7 16:43:12 1
5 100010101 2012/3/7 16:44:18 0
6 100010104 2012/3/7 16:44:24 1
7 100010102 2012/3/7 16:53:05 0
8 500010102 2012/3/7 16:53:47 1
9 500010102 2012/3/7 16:54:29 0
10 100010102 2012/3/7 16:54:32 1

以上是数据库表信息,注意该天登陆时间和登出时间可能不是配对的,即可能最后一条记录是登陆时间或第一条记录是登出时间,我想获取该角色当天的在线总时长,怎么实现??
rucypli 2012-08-20
  • 打赏
  • 举报
回复
select id,login_time,(select min(time)   as logout_time from tb B where B.is_login=0 and B.time>A.time)
from tb A
where is_login =1

56,687

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧