2016-03-06 88 views
1

我有一張表user_log我存儲有關用戶活動的信息,例如登錄和註銷操作。 表有四個colums:IDUSER_ID行動時間戳MySQL INNER JOIN複製一列

我想選擇所有註銷,並在一個結果表登錄行動時間戳一些USER_ID,會有列像這樣:

USER_IDlogin_timestamplogout_timestamp

我用這個MySQL查詢:

SELECT 
    user_log.user_id, 
    user_log_login.login_timestamp, 
    user_log_logout.logout_timestamp 
FROM 
    user_log 
INNER JOIN 
    (SELECT 
     user_id, timestamp as login_timestamp 
    FROM 
     user_log 
    WHERE 
     action = 'login successful') as user_log_login 
ON 
    user_log.user_id = user_log_login.user_id 
INNER JOIN 
    (SELECT 
     user_id, timestamp as logout_timestamp 
    FROM 
     user_log 
    WHERE 
     action = 'logout successful') as user_log_logout 
ON 
    user_log.user_id = user_log_logout.user_id 
WHERE 
    user_log.user_id = 4 

但結果包含login_timestamp的副本。 看一看: enter image description here

+1

是的,因爲'user_id = 4'有多個'logout_timestamp'。 –

+0

@MotoGP我擁有相同數量的登錄和註銷時間戳。使用with()選擇Distinct給了我語法錯誤,但是沒有括號,我得到和發佈一樣的問題。 – pavon147

+0

我想你會得到一個給定用戶的登錄和註銷時間戳的交叉結果。你需要添加更多的過濾條件。 –

回答

1

我可以建議另一種方法,在選擇相關查詢:

SELECT t.user_id,t.timestamp Login_Time , 
     (SELECT s.timestamp FROM user_log s 
     WHERE s.user_id = t.user_id and s.action = 'logout successful' 
      AND s.timestamp > t.timestamp 
     ORDER BY s.timestamp limit 1) as Logout_Time 
FROM user_log t 
WHERE t.user_id = 4 
    AND t.action = 'login successful' 

這基本上會選擇下一個註銷每個登錄並會更快然後從表中選擇3次。

+0

它就像一個魅力!謝謝! – pavon147