【问题标题】:Get MySQL results from two tables从两个表中获取 MySQL 结果
【发布时间】:2013-12-26 23:08:21
【问题描述】:

我有两个表,users 和 logins(login_time 列上的时间戳)

我正在尝试在 users 表中查找未登录超过 50 分钟的用户。

有些用户从未登录,这意味着他们在登录表中还没有条目,但我也需要能够在查询结果中找到他们,因为他们还没有登录。

这就是我所拥有的,但到目前为止,我只能在“登录”表中看到登录条目超过 50 分钟的用户,但任何其他从未登录的用户都没有出现。

    mysql_query("
    SELECT *
    FROM users l 
    LEFT JOIN logins h 
    ON l.id = h.user_id 
    WHERE abs(timestampdiff(MINUTE,now(), h.`login_time`)) >'50' 
    ")

如果我删除 WHERE 时间戳差异,我当然可以看到它们,但在 login_time 列中显示 NULL 值。

我怎样才能在结果中也显示其他用户?

谢谢。

【问题讨论】:

  • 如果用户从未登录过,您可以将默认时间戳设置为-infinity
  • 在 WHERE 子句中添加OR h.user_id IS NULL...

标签: php mysql


【解决方案1】:

两种可能的解决方案:

第一个:在查询中添加is null 条件:

SELECT *
FROM 
    users l 
LEFT JOIN 
    logins h ON l.id = h.user_id 
WHERE 
    abs(timestampdiff(MINUTE,now(), h.`login_time`)) >'50' 
    OR h.login_time is null;

第二个:使用coalesce函数:

SELECT *
FROM 
    users l 
LEFT JOIN 
    logins h ON l.id = h.user_id 
WHERE 
    coalesce(abs(timestampdiff(MINUTE,now(), h.`login_time`)), 60) >'50'

coalesce() 将返回第一个非空参数。

【讨论】:

  • 可能需要在合并中使用 51 而不是 50
  • @DavidFleeman 真的!抱歉打错字(意思是写 60)... 更正
  • 感谢大家的帮助!
【解决方案2】:

要获取从未登录过的用户,只需添加OR h.user_id IS NULL

SELECT *
FROM users l 
LEFT JOIN logins h 
ON l.id = h.user_id 
WHERE abs(timestampdiff(MINUTE,now(), h.`login_time`)) >'50'
     OR h.user_id IS NULL

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-02-14
    • 1970-01-01
    • 1970-01-01
    • 2020-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-29
    相关资源
    最近更新 更多