【发布时间】:2009-02-13 22:28:26
【问题描述】:
我有一个将状态信息转储到数据库的游戏。例如。已连接、丢失连接、抓取屏幕转储等。
每个状态都由一个名为 StateTypeId 的字段定义,它是简单查找表 'StateTypes' 的外键。
现在,我正在尝试查找所有当前为“Connected”的人(例如 StateTypeId == 1),但我不知道该怎么做。当我说当前连接时,我的意思是用户没有'LostConnection'状态(即StateType == 2)作为他们最近的条目。
我是这么想的。
SELECT UserId
FROM UserData
WHERE StateType = 1
GROUP BY UserId
或
SELECT UserId
FROM UserData
WHERE StateType != 1
GROUP BY UserId
但这会返回所有结果,而不仅仅是最近的结果。
有什么建议吗?
(我猜我错过了TOP(1) 和一些排名/顺序?)
编辑
DOH!我忘了提,我在表中有一个 DateTime 列 -> DateEntered。
编辑 2 - 澄清问题和一些示例数据。
我已经尝试了建议的解决方案,但运气不佳。因此,我将提供一些示例数据,看看这是否有助于澄清我的问题。
ID State UserName DateAdded
1 Connected Foo 1/1/2000 12:00
2 Connected Bar 1/1/2000 12:01
3 ScreenShot Foo 1/1/2000 12:05
4 LostConnection Foo 1/1/2000 12:06
5 Connected Joe 1/1/2000 12:10
6 LostConnection Joe 1/1/2000 12:15
7 Screenshot Bar 1/1/2000 12:16
8 Connected Jane 1/1/2000 12:22
所以看看这个,(当前)连接的人是 Bar 和 Jane。 Foo 和 Joe 走了。另请注意,Bar 的最后一个活动是截图,意思是,他的最后一个活动不是 LostConnection 状态。
HTH。
【问题讨论】:
-
UserData 中还有哪些其他列?
-
糟糕。我忘了提到 DateTime 列 :) 已编辑初始帖子。
-
也许这很明显,但是如果您经常执行此查询并且您有很多状态更改,那么您最好将最后一个状态非规范化到 UserData 表中。 Pro:更容易/更快地查询。缺点:更新数据库更难/更慢(必须做两件事并始终正确)
-
听起来很适合用作触发器...