MySQL中的子查询以检索最大日期(如果不存在则为NULL)

时间:2016-05-15 12:28:11

标签: mysql sql database

我有一个包含4个表(指定架构)的数据库

  • 用户:Userid, Username, Email (userid primary key)
  • USER_PERSONAL:Userid, username, email, mobile (userid primary key)
  • USER_HEALTH:Userid, Username, email, Problems (userid primary key)
  • 会话:Sessionid, userid, session date (userid foreign key,sessionid primary key)

我想编写一个查询,检索数据库中每个用户的上次会话的用户ID,用户名,电子邮件,移动设备,日期。

如果数据库中没有会话条目,则表示没有会话或NULL,但会打印其他详细信息。

我使用的查询:

select users.userid, users.username, users.email, mobile,
    problems, name, date_added, session_date 
from users,sessions,user_personal,user_health 
where sessions.session_date=(select max(session_date) 
                             from sessions 
                             where users.userid=sessions.userid) 
         and sessions.userid=users.userid and users.userid=user_personal.userid 
         and users.userid=user_health.userid;

但是如果没有会话详细信息,这不会检索用户的其他详细信息。 我该如何实现呢?

1 个答案:

答案 0 :(得分:1)

你可以用这个

select u.userid, u.username, u.email, up.mobile, uh.problems, s.max_session_date 
from users u
inner join user_personal up on u.userid = up.userid
inner join user_health uh on u.userid = uh.userid
left outer join (select userid, max(session_date) max_session_date
                 from sessions
                 group by userid
                 ) s
    on u.userid = s.userid;

您不应在查询中使用Old-style-join

即使用户从未有过会话,left outer join也会让你在max_session_date获得NULL(无会话)。