我有这个查询,可以从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)
,但是仍然没有显示没有登录日志的新用户。
答案 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;
这假设visible
在users
中。如果它在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_ok
和null
的值,则可以执行以下操作:
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