如何在SQL表中为用户获取激活的服务?

如何在SQL表中为用户获取激活的服务?,sql,sql-server,Sql,Sql Server,我在SQL数据库中有一个表,并为用户插入每个服务激活的最后状态 logid | userid | serviceid | status -------+-------------+-------------+-------- 1 | 123456789 | a | 0 2 | 123456789 | b | 1 3 | 123456789 | b |

我在SQL数据库中有一个表,并为用户插入每个服务激活的最后状态

logid  |  userid     |  serviceid  |  status
-------+-------------+-------------+--------
1      |  123456789  |      a      |      0
2      |  123456789  |      b      |      1
3      |  123456789  |      b      |      0
4      |  123456789  |      a      |      1
5      |  123456789  |      c      |      1
6      |  123456789  |      a      |      0
7      |  123456789  |      d      |      1
1) 如何使用select查询为用户返回活动服务? 例如:在上表中,我需要得到c,d,其中userid=123456789

2) 是否可以在表中添加另一个字段来存储当前状态,并编写触发器来更新行insert上所有记录的当前状态?(它可以工作,但在数百万条记录上需要很长时间)

3) 是否有一个查询来逐个读取所有记录,并将当前状态更新为插入所有记录后运行它的最后一个状态


谢谢

1:使用SQL。在一本关于sql的书的前20页中,您学习了简单的sql,我想说您应该这样做

从状态为1的WhateVeryourTableName中选择userid、serviceid

我的想法是,这可能不是你所要求的,但嘿,你必须解释清楚业务规则

2:是和否。为什么登录的用户会更新数百万行?这将是一个问题。包含由触发器维护的活动服务的用户/服务表是可行的,并且用户登录不会更新数百万行


3:不清楚你在问什么。但确实存在这样的疑问。如果您获得最后一个状态,则进行更新是很简单的,这也是很简单的。

回答您的第一个问题:

select t.serviceid
from Log t
where t.status=1 and userid=123456789
group by t.logid,t.serviceid
having t.logid=(select max(tt.logid) from Log tt where tt.serviceid=t.serviceid)

SqlFiddle:

不管它值多少钱,我都会有一个单独的带有服务状态的表

statusid  |  userid     |  serviceid  |  status
----------+-------------+-------------+--------
1         |  123456789  |      a      |      0
2         |  123456789  |      b      |      0
3         |  123456789  |      c      |      1
4         |  123456789  |      d      |      1

我会对userid、serviceid有一个唯一的约束,或者将这两列作为主键而不是id列,如果合适,在这种情况下可以删除id列。我还将在日志表上放置一个触发器,并更新这个新状态表中的状态。请注意,这只会更新一条记录。

嗨,我的朋友。非常感谢。您的查询在sqlfiddle.com中运行完美,但在我的本地系统中不会返回任何记录!!!我也使用SQL Server 2012。非常奇怪,我在我的本地系统上尝试了它,它工作正常!