Mysql sql从用户登录日志表中查找统计信息

Mysql sql从用户登录日志表中查找统计信息,mysql,sql,odbc,ado,adodb,Mysql,Sql,Odbc,Ado,Adodb,我有一个与mysql数据库通信的vb应用程序。 当用户登录时,这将在“LoginLog”表中创建一个新行 例如: id user datein lastactive dateout computer 1 brian 2013-01-01 12:11 NULL NULL br-Office 当brian关闭应用程序时,一些代码将查找最后一个bria

我有一个与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的不同用户,但是有些用户只是关闭了他们的电脑,否则他们会崩溃,因此无法捕获dateout时间。因此,我希望有一个限制,例如dateout null,但其中datein小于24小时前


我还希望能够通过应用程序中的一些SQL一次性在线查找有史以来最多的用户。我要指出,我没有办法使用
Set@variable有效,因为应用程序一次只能通过ADO/ODBC执行一条语句。如果我单独运行语句,那么从一个语句到下一个语句都不会记住变量。我必须运行select语句来返回要作为变量分配给应用程序的值,以及用于形成下一个查询的应用程序变量。我也不能通过应用程序执行存储过程。那么,select语句可能会变得很粗暴吗?

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

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;

去掉分号,您应该能够使用set@variable。如果您在
set@variable=0
后面加上单词“select”,它会立即在workbench中标记为无效语法,并且如果您实际提交,当然会返回一个错误,例如
set@varhg='1'select*from loginlog