日期:2014-05-19  浏览次数:20464 次

有个操作日志表,要按用户查询操作信息,如何写SQL?
有个表Log,有字段id,type,time。type=0表示用户进入,type=1表示用户离开
Log
id     type     time
0         0         1
0         1         2
1         0         4
1         1         5
0         0         6
0         1         8
2         0         9

现在希望显示如下信息
Out
id   in_time   out_time
0     1               2
0     6               8
1     4               5
2     9               null
按用户显示其进入时间和离开时间
如何写SQL?

------解决方案--------------------
select id,case when type=0 then time end as in_time,case when type=1 then time end as out_tim
from Log
------解决方案--------------------
select id,time as in_time,out_time=(select top 1 time from log b where b.type=1 and a.id=b.id and b.time> a.time order by time) from log a
where type=0
------解决方案--------------------
用循环写?
------解决方案--------------------
select
a.id,a.time as in_time,min(b.time) as out_time
from
log a
left join
log b
where
a.id=b.id and a.time <b.time
group by
a.id,a.time
------解决方案--------------------
我那个不对,想错了! :(
------解决方案--------------------
收藏 ---
------解决方案--------------------
提点意见,首先要保证进入和离开这两条数据一定要有健全机制保证成对出现,那么查询才有意义。
------解决方案--------------------
将语句里有log的地方换成你的查询语句,两头加上括号即可
------解决方案--------------------
都换,或者你用个视图来代替也行
------解决方案--------------------
maple0112() ( ) 信誉:100 Blog 加为好友 2007-04-13 11:42:23 得分: 0


提点意见,首先要保证进入和离开这两条数据一定要有健全机制保证成对出现,那么查询才有意义。


同意以上观点,你这个表设计的就有问题

------解决方案--------------------
SELECT intime.Id,intime.time in_time,min(outtime.time) out_time
FROM (
SELECT id,time
FROM Log intime
WHERE type=0
)intime LEFT JOIN (
SELECT id,time
FROM Log outtime
WHERE type=1
)outtime
ON intime.id=outtime.Id
AND intime.time <outtime.time
GROUP BY intime.Id,intime.time
ORDER BY intime.Id


表结构设计有问题,不然也不至于如此麻烦。
------解决方案--------------------
mark
------解决方案--------------------
学习
------解决方案--------------------
mark
------解决方案--------------------
应该再加一个字段group2,标识那两条是属于同组的纪录(需要在写程序的时候合理判断),即为1,2,3.....然后sql就很容易查了