左加入破碎?

问题描述:

所以我有一个MySQL查询,它曾经按照预期工作,但现在我想一些事情已经发生,它似乎不再工作。左加入破碎?

我有什么是我想加入的2个表格。 “

用户

日志

我想在所有的用户ID(UID)的列表 ”用户“ 表中有今天已经登录,所以我用这个查询。

SELECT users.UID 
FROM users 
LEFT JOIN logs 
    ON users.UID = logs.UID 
AND DATE(logs.SCANTIME)=DATE(SYSDATE()) 
WHERE logs.UID is null 

上面的查询用于工作,但现在返回一个不应该存在的UID列表。

如果我今天查看日志,我可以看到多行,为了节省空间,我省略了所有行。

mysql> SELECT UID, SCANTIME FROM logs WHERE DATE(scantime)=DATE(SYSDATE()); 
    +------------+---------------------+ 
    | UID  | SCANTIME   | 
    +------------+---------------------+ 
    ............. 
    | AA9B351B | 2017-08-02 06:13:21 | 
    ............. 
    +------------+---------------------+ 
    63 rows in set (0.00 sec) 

因此,这家伙AA9B351B今天清楚登录。然而,当我运行上面的查询时,他显示出来了。谢谢任何回复

+0

@Dhruv Saxena - LEFT JOIN将返回所有用户,但不会WHERE子句,然后筛选结果,以便只返回适用的用户。 – BusinessPlanQuickBuilder

+0

查询看起来很好。考虑到客户端和服务器可能有不同的时间,检查'sysdate()'值是很重要的,并且可以在几个点和层次上配置/覆盖时区。除此之外,有几个服务器端配置可能会影响您的查询结果。 – Sal

+0

我看到两种可能性。 1)时间(logs.scantime)不会返回您认为'6:00'与'01:00'相比较而比较字符串级别而不是“时间”数据类型。 2)您在该用户的日志中记录了多个记录。至少其中一个是今天01:00之前和12:00之后。如果您的目标是仅在01:00和12:00之间登录才能显示用户,那么在其他人指出的情况下,内部联接更适合。你在做什么?查找所有今天还没有登录的用户在几小时之内? – xQbert

服务器时间可能变得不正确,所以SYSDATE返回错误的值。检查系统时间,并运行SYSDATE函数替换为文字(仅用于测试)的SQL查询。也与此检查相关的时区没有改变。如果服务器时间错误,则重置。