0

我今天如何选择所有登录用户?我有两张表,一张保存用户信息,另一张保存所有登录/注销时间信息。

table users
===================================
userid | Name | FamilyName | Position

table movements
===================================
userid | Date | Hour | Status 

Table movements fields:

userid - holds user unique ID number (same as table users);
Date - holds users login/logout date (example: 2013-10-08 00:00:00);
Hour - holds users login/logout date time (example: 2013-10-08: 17:10:39);
Status - holds users flag (0 or 1) where 1 - login and 0 - logout;

表用户是不言自明的。

到目前为止,我一直在尝试这样的事情:

select p.userid, 
       p.Name, 
       p.FamilyName, 
       p.Position, 
       m.Date, 
       m.Status, 
       m.Hour 
from users as p 
   INNER JOIN movements as m ON p.userid=m.userid;

任何帮助表示赞赏。谢谢。

4

4 回答 4

0

假设:

  1. Hour 是一个 DATETIME 字段,其中包含登录/注销事件的时间戳
  2. 数据库中的日期是当地时间,当您说“今天登录的用户”时,您指的是当地时间的今天。
  3. 服务器上的时间也是当地时间。
  4. status 不能是 1 或 0 以外的任何值
select p.Name, 
       p.FamilyName, 
       p.Position,  
       MAX(m.Hour) logged_in_datetime
FROM users AS p,
     movements as m
WHERE p.userid = m.userid
  AND m.Hour >= DATE(NOW())
GROUP BY p.Name, 
       p.FamilyName, 
       p.Position
HAVING SUM( IF(m.status=1,1,-1)) > 0
于 2013-10-08T23:03:58.773 回答
0
select distinct
    p.userid, p.Name, p.FamilyName, p.Position
from 
    users as p 
inner join 
    movements as m on p.userid=m.userid
where 
    day(m.date) = day(getdate()) and
    month(m.date) = month(getdate()) and
    year(m.date) = year(getdate())

注意:您没有指定您使用的数据库服务器。getdate() 用于 Microsoft Sql Server。如果你使用 MySql,你必须使用 curdate()。如果您使用其他数据库服务器,您应该搜索等效功能。

在 Sql Server 中 getdate() 存储日期和时间,因此如果将日期与“=”进行比较,如果它们具有相同的日期但不同的时间,它们可能会有所不同。

于 2013-10-08T21:39:01.577 回答
0

更新了评论中的解释:

对于当前登录的任何人:

Select 
   u.userid, 
   u.Name, 
   u.FamilyName, 
   u.Position,
   m.Date,
   m.Hour
From
   users u 
      Inner Join (
         Select m1.*
         From movements m1
            Left Outer Join movements m2 on ( m1.userid = m2.userid AND m1.Hour < m2.Hour )
         Where 
            m2.UserId Is NULL and
            m1.Date >= CurDate() ) m on m.userid = u.userid
Where m.Status = 1
于 2013-10-08T21:33:55.390 回答
-1

以下查询将为您提供当前日期的活跃用户的用户 ID,您应该能够从那里找出其余的...

select distinct(userid) from movements where date = GETDATE()
于 2013-10-08T21:13:49.207 回答