左加入破碎?
问题描述:
所以我有一个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今天清楚登录。然而,当我运行上面的查询时,他显示出来了。谢谢任何回复
答
服务器时间可能变得不正确,所以SYSDATE返回错误的值。检查系统时间,并运行SYSDATE函数替换为文字(仅用于测试)的SQL查询。也与此检查相关的时区没有改变。如果服务器时间错误,则重置。
@Dhruv Saxena - LEFT JOIN将返回所有用户,但不会WHERE子句,然后筛选结果,以便只返回适用的用户。 – BusinessPlanQuickBuilder
查询看起来很好。考虑到客户端和服务器可能有不同的时间,检查'sysdate()'值是很重要的,并且可以在几个点和层次上配置/覆盖时区。除此之外,有几个服务器端配置可能会影响您的查询结果。 – Sal
我看到两种可能性。 1)时间(logs.scantime)不会返回您认为'6:00'与'01:00'相比较而比较字符串级别而不是“时间”数据类型。 2)您在该用户的日志中记录了多个记录。至少其中一个是今天01:00之前和12:00之后。如果您的目标是仅在01:00和12:00之间登录才能显示用户,那么在其他人指出的情况下,内部联接更适合。你在做什么?查找所有今天还没有登录的用户在几小时之内? – xQbert