我正在进行一项简单的联接查询,目的是找到用户尚未投票的最新记录:
SELECT
v.user_id,
v.version_id,
vv.user_id
FROM versions v
LEFT JOIN versions_votes vv ON v.version_id = vv.version_id
WHERE vv.user_id != 39;
奇怪的是,如果vv.user_id为null,则不会返回任何行。我不确定行人对该问题的理解是NULL 不能等于任何东西 - '这就是为什么我们必须首先测试IS NULL
而不是=NULL
。
然而,我们在这里 - 如果我按如下方式修改WHERE子句:
WHERE (vv.user_id != 39 OR vv.user_id IS NULL)
该查询似乎正常工作(并且似乎也确认NULL
正在评估为39。
答案 0 :(得分:2)
你是对的NULL cannot be equal to anything
你缺少的是NULL cannot be unequal, either。
NULL
与任何事物相比总是NULL
。手头的问题是你得到了LEFT JOIN
错误。这应该有效:
SELECT v.user_id, v.version_id, vv.user_id
FROM versions v
LEFT JOIN versions_votes vv ON v.version_id = vv.version_id
AND vv.user_id = 39
WHERE vv.version_id IS NULL
ORDER BY v.created
LIMIT 1;
您在vv
子句中引用了WHERE
的附加条件:AND vv.user_id != 39
。可能期望NULL != 39
符合条件,但事实并非如此。这个相关答案的更多细节:
Query with LEFT JOIN not returning rows for count of 0
基本上三种技术可以做到这一点:
Select rows which are not present in other table