【问题标题】:MySQL INNER JOIN duplicates one columnMySQL INNER JOIN 重复一列
【发布时间】:2016-06-19 22:09:53
【问题描述】:

我有一个表 user_log,我在其中存储有关用户活动的信息,例如登录和注销操作。 表格有四列:iduser_idactiontimestamp

我想在一个结果表中选择一些 user_id 的所有注销和登录操作时间戳,会有这样的列:

user_id login_timestamp logout_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 的重复项。 看一看:

【问题讨论】:

  • 是的,因为user_id = 4 有多个logout_timestamp
  • @MotoGP 我有相同数量的登录和注销时间戳。选择 Distinct using with () 给我语法错误,但没有括号我遇到了与发布的相同的问题。
  • 我认为你会得到一个给定用户的登录和注销时间戳的交叉连接结果。您需要添加更多过滤条件。

标签: php mysql sql


【解决方案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 次更快。

【讨论】:

    猜你喜欢
    • 2022-12-05
    • 1970-01-01
    • 2012-07-24
    • 1970-01-01
    • 1970-01-01
    • 2021-10-20
    • 1970-01-01
    • 1970-01-01
    • 2017-02-18
    相关资源
    最近更新 更多