2013-10-08 18 views
0

今天我如何選擇所有登錄用戶?我有兩個表,一個持有用戶信息,另一個持有所有登錄/註銷時間信息。SQL今天選擇所有登錄用戶

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; 

任何幫助表示讚賞。謝謝。

+0

那是誰已經在今天登錄的所有用戶,或所有用戶仍然登錄在今天? –

+0

這是所有用戶仍然登錄+他們的個人信息作爲第一個表中的姓名,家庭姓名和職位。 –

+1

您正在使用哪些DBMS?甲骨文? Postgres的? –

回答

-1

下面的查詢會給你的當前日期的活躍用戶的用戶ID,你應該能夠從那裏弄清楚休息了...

select distinct(userid) from movements where date = GETDATE() 
+0

從配偶丟失的位... –

+0

照顧精心製作託尼? –

+0

在你編輯之前看過它,選擇*從選擇不同....),以及至少它是如何出現在我的電視上。 –

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 
+0

我怎樣才能得到最後的登錄時間(最大小時記錄) –

+0

第一個查詢不需要登出帳戶。如果用戶當天登錄一次,則無論他們是否已經註銷,他們都將顯示在結果中。 – Drew

+0

我在Stoyan的評論之前回答了詳細闡述過程和結構。我會在澄清時間欄後進行修改。 – Tony

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()存儲日期&時間,所以如果你比較日期「=」,他們可能是不同的,如果它們具有相同的一天,但不同的時間。

+1

問題的正確答案*只標記'sql'將使用由SQL標準定義的函數:'current_date'和'extract()' –

+0

我正在使用MySQL服務器 –

0

假設:

  1. 小時是包含登錄/註銷事件
  2. 日期數據庫在本地時間的時間戳的日期時間字段,當你說「登錄的用戶現在」你指的是今天在當地時間。
  3. 服務器上的時間也在當地時間。
  4. 狀態不能不是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