求SQL,急

whos2002110 2013-05-15 04:04:53
正上班呢,碰到个sql不会写啊

我有个用户状态表是来记录用户的出入状态
字段有 id userId status date

当用户A(id=10) 在date='2012-01-12 12:12:12' '入' 则会存入记录 1,10,1,'2012-01-12 12:12:12'
当用户A(id=10) 在date='2012-05-12 xx:xx:xx' '出' 则会存入记录 2,10,0,'2012-05-12 xx:xx:xx'
当用户M(id=50) 在date='xxxx-xx-xx xx:xx:xx' '入' 则会存入记录 3,50,1,'xxxx-xx-xx xx:xx:xx'
...

当然主键是自增的, 用户跟状态表是一对多, 我想要用户集合,当且仅当用户的最大时间对应的status为1的记录.

上面的例子中A用户的最大时间为2012-05-12 xx:xx:xx 对应的状态为0(就当他只有上面这两条记录,实际可能很多)则不在我要的集合中
M用户最大时间为xxxx-xx-xx xx:xx:xx 状态为1 这要这条记录

应该讲的很清楚了,逻辑也不复杂的
...全文
73 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
發糞塗牆 2013-05-15
  • 打赏
  • 举报
回复
引用 9 楼 whos2002110 的回复:
[quote=引用 8 楼 DBA_Huangzj 的回复:] 完事结贴,不然要等15天版主才能结贴。
你分多不多送我点百, 我发不了贴了快[/quote]分不能送的.....
whos2002110 2013-05-15
  • 打赏
  • 举报
回复
引用 8 楼 DBA_Huangzj 的回复:
完事结贴,不然要等15天版主才能结贴。
你分多不多送我点百, 我发不了贴了快
發糞塗牆 2013-05-15
  • 打赏
  • 举报
回复
完事结贴,不然要等15天版主才能结贴。
whos2002110 2013-05-15
  • 打赏
  • 举报
回复
嗯,谢谢
發糞塗牆 2013-05-15
  • 打赏
  • 举报
回复
引用 5 楼 whos2002110 的回复:
[quote=引用 4 楼 DBA_Huangzj 的回复:] [quote=引用 3 楼 whos2002110 的回复:] [quote=引用 1 楼 DBA_Huangzj 的回复:]
SELECT * FROM 
TB a
WHERE EXISTS
(SELECT 1 FROM (
SELECT userID,MAX([date])[date]
FROM TB 
WHERE [status]=1
GROUP BY userID) b WHERE a.userID=b.UserID AND A.[date]=b.[date])
这样?
可不可以不要查两边,这样写我可能会被鄙视的, 不过谢谢你[/quote]虽然我的不一定是最好的,但是我倒想看看谁那么牛逼,要鄙视这种写法,还有很多人用not exists的呢,我这个已经很高效了[/quote] 大哥, 其实是这样的, 因为这个出入状态的话是只能会先入后出, 所以换个角度就是说如果某用户在状态表中有奇数条记录的话可以理解为跟我要的效果一样, 所以一个同事说group by 以下然后having count(1)%2 = 1 就查出来了,我不赞成的思路尽管结果可能是对的, 所以就来这里请教了,没有鄙视的意思[/quote]如果是单纯算奇偶数那就不是我的写法了。他的写法是可以的。但是如果按照你一开始的说法,我的写法也是可以的。这涉及业务逻辑。没有绝对的对与错
whos2002110 2013-05-15
  • 打赏
  • 举报
回复
引用 4 楼 DBA_Huangzj 的回复:
[quote=引用 3 楼 whos2002110 的回复:] [quote=引用 1 楼 DBA_Huangzj 的回复:]
SELECT * FROM 
TB a
WHERE EXISTS
(SELECT 1 FROM (
SELECT userID,MAX([date])[date]
FROM TB 
WHERE [status]=1
GROUP BY userID) b WHERE a.userID=b.UserID AND A.[date]=b.[date])
这样?
可不可以不要查两边,这样写我可能会被鄙视的, 不过谢谢你[/quote]虽然我的不一定是最好的,但是我倒想看看谁那么牛逼,要鄙视这种写法,还有很多人用not exists的呢,我这个已经很高效了[/quote] 大哥, 其实是这样的, 因为这个出入状态的话是只能会先入后出, 所以换个角度就是说如果某用户在状态表中有奇数条记录的话可以理解为跟我要的效果一样, 所以一个同事说group by 以下然后having count(1)%2 = 1 就查出来了,我不赞成的思路尽管结果可能是对的, 所以就来这里请教了,没有鄙视的意思
發糞塗牆 2013-05-15
  • 打赏
  • 举报
回复
引用 3 楼 whos2002110 的回复:
[quote=引用 1 楼 DBA_Huangzj 的回复:]
SELECT * FROM 
TB a
WHERE EXISTS
(SELECT 1 FROM (
SELECT userID,MAX([date])[date]
FROM TB 
WHERE [status]=1
GROUP BY userID) b WHERE a.userID=b.UserID AND A.[date]=b.[date])
这样?
可不可以不要查两边,这样写我可能会被鄙视的, 不过谢谢你[/quote]虽然我的不一定是最好的,但是我倒想看看谁那么牛逼,要鄙视这种写法,还有很多人用not exists的呢,我这个已经很高效了
whos2002110 2013-05-15
  • 打赏
  • 举报
回复
引用 1 楼 DBA_Huangzj 的回复:
SELECT * FROM 
TB a
WHERE EXISTS
(SELECT 1 FROM (
SELECT userID,MAX([date])[date]
FROM TB 
WHERE [status]=1
GROUP BY userID) b WHERE a.userID=b.UserID AND A.[date]=b.[date])
这样?
可不可以不要查两边,这样写我可能会被鄙视的, 不过谢谢你
whos2002110 2013-05-15
  • 打赏
  • 举报
回复
犀利的DBA在哪里, 我只需要你的一句话
發糞塗牆 2013-05-15
  • 打赏
  • 举报
回复
SELECT * FROM 
TB a
WHERE EXISTS
(SELECT 1 FROM (
SELECT userID,MAX([date])[date]
FROM TB 
WHERE [status]=1
GROUP BY userID) b WHERE a.userID=b.UserID AND A.[date]=b.[date])
这样?

27,580

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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