即使一行为空也获取数据

时间:2018-11-29 21:11:21

标签: mysql sql

我有这个查询,可以从users表中获取用户,还可以从time表中获得最新的logs(时间戳),其中的条目是“ login_ok”。旨在显示用户列表以及他们最后一次登录。

SELECT u.`id`, u.`email`, u.`firstname`, u.`lastname`, u.`type`, u.`creation_date`, MAX(l.`time`) as `last_login`
FROM `users` AS u
JOIN `logs` AS l ON u.id = l.user_id
WHERE l.`action` = 'login_ok'
AND `visible` = 1
GROUP BY u.`id`
ORDER BY u.`id` ASC

我的问题是:如果用户从未登录过,则该用户不存在“ login_ok”条目,因此查询无法获取该用户数据。

即使l.time上的logs不存在,是否可以获取所有用户数据?我尝试使用JOIN name_admin_users_log AS l ON (l.时间IS NOT NULL AND u.id = l.user_id),但是仍然没有显示没有登录日志的新用户。

4 个答案:

答案 0 :(得分:1)

使用left join

SELECT u.`id`, u.`email`, u.`firstname`, u.`lastname`, u.`type`, u.`creation_date`, MAX(l.`time`) as `last_login`
FROM `users` u LEFT JOIN
     `logs` l
     ON u.id = l.user_id AND l.`action` = 'login_ok'
WHERE u.`visible` = 1
GROUP BY u.`id`
ORDER BY u.`id` ASC;

这假设visibleusers中。如果它在logs中,则该条件也应该在ON子句中。

答案 1 :(得分:1)

使用LEFT JOIN代替常规的JOIN(实际上是INNER JOIN),然后将action = 'login_ok'上的过滤器移至该LEFT JOIN子句。 / p>

NB:从您的查询中,我们无法确定visible列来自哪个表,因此我认为它与users相关...

SELECT
    u.id, 
    u.email,
    u.firstname,
    u.lastname,
    u.type,
    u.creation_date,
    MAX(l.time) as last_login
FROM users AS u
LEFT JOIN logs AS l
    ON u.id = l.user_id and l.action = 'login_ok' 
WHERE u.visible = 1
GROUP BY u.id
ORDER BY u.id ASC

答案 2 :(得分:0)

您可以简单地忽略login_ok并搜索l.action的所有值。

但是,如果您只需要包含login_oknull的值,则可以执行以下操作:

WHERE l.`action` = 'login_ok' OR l.`action` is null 

答案 3 :(得分:0)

您应该使用LEFT / RIGHT联接而不是JOIN(inner) 例如:

SELECT u.id, u.name, l.time
FROM users u LEFT JOIN logs l
  ON u.id=l.user_id

在这种情况下,您将从“ users”(select中左侧的表:users-left,logs-right)中获取所有记录,并从right(“ logs”)表中获取所有记录u.id = l.user_id为true。

最后,您会得到这样的东西:

u.id   u.name   l.time
 1      John    10.00am
 2      Mary    2.15pm
 3      Mark    null