【问题标题】:MYSQL tricky inner join errorMYSQL棘手的内部连接错误
【发布时间】:2012-03-06 12:37:23
【问题描述】:

我试图从我的 user_log 表中获取一天中的第一个人(标记为 user_log.userlog_log_type=1)和最后一个人(log_type=2)。在用户中,我有 user_id pk 和 user_name,在 user_log 中,我在第一个表中有 user_id 的 userlog_user_id FK。

现在我设法获得了每天的第一个条目和每天的最后一个条目。但是当我使用内部连接来获取我想要的表时(day,firstIn,lastOut) ,我得到一个错误并且似乎找不到我做错了什么:

如果有人可以提供帮助,我将不胜感激。非常感谢!

【问题讨论】:

    标签: mysql database inner-join


    【解决方案1】:

    看起来您要经历很多事情才能获得一点...我会从一个查询开始,以每天获取最小和最大人员,然后从那里开始。我想要一个关于用户日志时间戳的索引...

    select
          LogInOut.LogActivity,
          LogInOut.JustDay,
          LogInOut.What_Time,
          ULMain.UserLog_User_ID,
          U1.user_name
       from
          ( select
                  day( UL.UserLog_Timestamp ) as JustDay,
                  max( UL.UserLog_Log_type ) as LogActivity,
                  min( UL.userlog_timestamp ) as What_Time
               from
                  UserLog UL
               where
                  UL.UserLog_Log_Type = 1
               group by
                  day( UL.UserLog_Timestamp )
            UNION
            select
                  day( UL.UserLog_Timestamp ) as JustDay,
                  max( UL.UserLog_Log_type ) as LogActivity,
                  max( UL.userlog_timestamp ) as What_Time
               from
                  UserLog UL
               where
                  UL.UserLog_Log_Type = 2
               group by
                  day( UL.UserLog_Timestamp ) ) LogInOut
    
          JOIN UserLog ULMain
             on LogInOut.What_Time = ULMain.UserLog_Timestamp
             AND LogInOut.LogActivity = ULMain.UsrLog_Log_Type
    
             JOIN Users U1
                on ULMain.UserLog_User_ID = U1.User_ID
      order by
         LogInOut.JustDay,
         LogInOut.LogActivity
    

    会创建类似的东西

    LogActivity JustDay What_Time UserLog_User_ID  user_name
    1           Mar 1   7:56am    123              Bill Board
    2           Mar 1   6:23pm    431              Eilean Dover
    1           Mar 2   7:02am    98               Crystal Clear
    2           Mar 2   6:47pm    221              Ben Dover
    

    现在,如果您希望将其汇总为单行(交叉表),以便一行显示当天,谁在第一个,谁最后一个,我将更改顶部并通过类似的方式添加一个组

    select
          LogInOut.JustDay,
          MIN( LogInOut.What_Time ) as EarlyLogin,
          MAX( IF( LogInOut.LogActivity = 1, U1.User_Name, ' ' )) as EarlyUser,
          MAX( LogInOut.What_Time ) as LastLogOut
          MAX( IF( LogInOut.LogActivity = 2, U1.User_Name, ' ' )) as LastUser
       from
          (exact rest of from / join / order by clause)
       group by
          LogInOut.JustDay
    
    
    JustDay  EarlyLogin   EarlyUser      LastLogOut   LastUser
    Mar 1    7:56am       Bill Board     6:23pm       Eilean Dover
    Mar 2    7:02am       Crystal Clear  6:47pm       Ben Dover
    

    【讨论】:

    • 正如我在编辑的问题中所述,我只能使用这两个表。虽然 +1。
    • @Fofole,我只使用了您提供的两个表...“别名”引用是内部 SQL 临时结果集,没有使用“其他”表。
    猜你喜欢
    • 1970-01-01
    • 2020-06-06
    • 1970-01-01
    • 2018-06-25
    • 1970-01-01
    • 2015-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多