0

我有一个与 mysql 数据库通信的 vb 应用程序。当用户登录时,这会在“LoginLog”表中创建一个新行。

例如:

id      user           datein             lastactive        dateout     computer
1       brian          2013-01-01 12:11   NULL              NULL        br-Office

当 brian 关闭应用程序时,一些代码将查找最后一个 brian 条目,其中 null 作为 dateout,br-Office 作为计算机,并使用dateout=Now().

(“计算机”很重要,因为用户可以从一台 PC 登录,在不注销的情况下放弃它,然后使用另一台 PC 登录,因此分离实例很重要。)

'Last active' 目前没有使用,我将让它存储用户执行的最后一个活动的时间,所以我可以找出用户是否有 5 分钟或更长时间没有处于活动状态。

我想知道我可以在应用程序中使用什么 SQL 来查找当前在线的用户列表。我可以只搜索具有空 dateout 的不同用户,但是有些用户只是关闭了他们的 PC,否则他们会崩溃,因此不会捕获 dateout 时间。因此,我想要一个限制,例如 dateout null,但 datein 小于 24 小时前。

我还希望能够通过应用程序中的一些 SQL 一次找出最多的在线用户。我会指出,我无法Set @variable;有效地使用,因为应用程序一次只能通过 ADO/ODBC 执行一条语句。如果我单独运行语句,则不会记住从一个语句到下一个语句的变量。我必须运行 select 语句来返回值以分配为应用程序中的变量,并且应用程序的变量用于形成下一个查询。我也无法通过应用程序执行存储过程。那么它可能是选择语句的蛮力吗?

4

1 回答 1

0

要让用户在线,您需要知道每个用户的最后一行。然后你只需要应用逻辑:

select
from LoginLog ll
where datein >= now() - interval 1 day and
      id = (select id
            from LoginLog ll2
            where ll2.user = ll.user and
                  ll2.computer = ll.computer
            order by datein desc
            limit 1
           ) and
      dateout is not null;
于 2013-06-20T00:05:25.270 回答