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

时间:2014-06-17 06:09:57

标签: sql sql-server

我在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)如何为用户提供返回活动服务的选择查询? 例如:在上表中,我需要得到c,d其中userid = 123456789

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

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

由于

3 个答案:

答案 0 :(得分:1)

回答你的第一个问题:

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:http://sqlfiddle.com/#!6/9ff99/5

答案 1 :(得分:0)

1:使用SQL。你在一本关于SQL的书的前20页中学到的简单sql - 我会说你应该这样做。

从whateveryoourtablename中选择userid,serviceid,其中status = 1

我认为这可能不是你要求的,但是嘿 - 你能够清楚地解释业务规则。

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

3:不清楚你在问什么。但是,存在这样的查询。如果你获得最后的状态并且这也是微不足道的,那么进行更新是微不足道的。

答案 2 :(得分:0)

对于它的价值,我会有一个单独的表,其中包含服务状态

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

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