我做一个平凡的加盟,以寻找最新的记录是,用户没有投票还没有意向的查询:
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。
你是正确的, NULL cannot be equal to anything
。
你所缺少的是NULL不能是不等的,无论是 。
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
将有资格,但事实并非如此。 在这个相关答案更多细节:
与LEFT JOIN的查询不是为0计数返回行
基本上有三种技术来做到这一点:
它不存在于其他表中选择行