即使一行为空也获取数据

ac1kyiln  于 2021-06-17  发布在  Mysql
关注(0)|答案(4)|浏览(328)

我有这个查询从 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.timelogs 不存在吗?我试过了 JOIN 名称\管理\用户\日志 AS l ON (l. 时间 IS NOT NULL AND u.id = l.user_id) 但仍然没有显示没有登录日志的新用户。

qqrboqgw

qqrboqgw1#

使用 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 条款。

uttx8gqw

uttx8gqw2#

您应该使用左/右连接而不是连接(内部),例如:

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中左侧的表)获取所有记录,并从右侧的'logs'表获取所有记录,条件u.id=l.user\u id为true。
最后你会得到这样的结果:

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

k97glaaz3#

使用 LEFT JOIN 而不是普通的 JOIN (这实际上意味着 INNER JOIN ),然后移动过滤器 action = 'login_ok' 为了这个 LEFT JOIN 条款。
注意:从您的查询中,我们无法判断是哪个表 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
d8tt03nd

d8tt03nd4#

你可以忽略 login_ok 并搜索 l.action .
但如果你只想要 login_ok 以及 null 然后你可以做:

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

相关问题