我有这个查询从 users
表并获取最新信息 time
(时间戳)从 logs
表中的条目为“login\u 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\u ok”条目不存在,因此查询无法获取该用户数据。
是否有任何方法可以获取所有用户数据,即使 l.time
在 logs
不存在吗?我试过了 JOIN
名称\管理\用户\日志 AS l ON (l.
时间 IS NOT NULL AND u.id = l.user_id)
但仍然没有显示没有登录日志的新用户。
4条答案
按热度按时间h9a6wy2h1#
使用
left join
:这是假设
visible
在users
. 如果是在logs
,则该条件也应在ON
条款。cgvd09ve2#
您应该使用左/右连接而不是连接(内部),例如:
在这种情况下,您将从'users'(select:users-left,logs-right中左侧的表)获取所有记录,并从右侧的'logs'表获取所有记录,条件u.id=l.user\u id为true。
最后你会得到这样的结果:
ar5n3qh53#
使用
LEFT JOIN
而不是普通的JOIN
(这实际上意味着INNER JOIN
),然后移动过滤器action = 'login_ok'
为了这个LEFT JOIN
条款。注意:从您的查询中,我们无法判断是哪个表
visible
列来自,所以我假设它与users
...piah890a4#
你可以忽略
login_ok
并搜索l.action
.但如果你只想要
login_ok
以及null
然后你可以做: