我的查询如下:
$(".field-validation-error").toggle();
为什么查询还返回SELECT * FROM users U LEFT JOIN posts P ON P.userId = U.id AND P.userId IS NOT NULL;
为userId
的结果?
我知道,根据我的需要,我可以使用null
仅获取与用户相关的帖子,但是很奇怪INNER JOIN
支持多个条件,但不能使用NOT NULL条件。
答案 0 :(得分:4)
这是因为“posts”不包含空值,因此无法在该阶段过滤它们。只有当服务器在右表上找不到相应的行时,才会通过连接生成Null值。所以只需将not null放在where子句中就可以了:
SELECT * FROM users U LEFT JOIN posts P ON P.userId = U.id WHERE userId IS NOT NULL;
(编辑:你应该使用内部联接来进行富有成效的工作,因为这是正确的方式并且会给你更高的性能。)
您还可以通过反转以下内容来查看所有没有帖子的用户:
SELECT * FROM users U LEFT JOIN posts P ON P.userId = U.id WHERE userId IS NULL;
答案 1 :(得分:0)
您正在加入posts
表。这意味着对于users
中没有匹配的每条posts
条记录,您仍会获得所有posts
列为空的记录。
所以说你有一个{id} = 5的users
记录,并且没有id {5的posts
记录。
ON P.userId = U.id AND P.userId IS NOT NULL
未满足两个组合条件(用户ID 5没有记录),因此您获得users
条记录,其结果中所有posts
列都设置为空。
也许您只是在寻找内部联接?所有users
条记录及其posts
数据?
答案 2 :(得分:0)
试试这个
SELECT * FROM users U LEFT JOIN posts P ON P.userId = U.id
SELECT * FROM users U LEFT JOIN posts P ON P.userId = U.id where P.userId IS NOT NULL;
答案 3 :(得分:0)
此查询:
SELECT *
FROM users U LEFT JOIN
posts P
ON P.userId = U.id AND P.userId IS NOT NULL;
返回users
中的所有行以及posts
中的所有列,无论它们是否匹配。无论ON
子句的计算结果为TRUE还是FALSE,都是如此。
你想要的是WHERE
。此外,您只应选择users
:
SELECT u.*
FROM users U LEFT JOIN
posts P
ON P.userId = U.id
WHERE P.userId IS NOT NULL;
请注意,您也可以使用NOT IN
或NOT EXISTS
完成此操作。
答案 4 :(得分:0)
因为LEFT JOIN 必须按照它的定义返回左表中的每一行。根据ON子句评估,可以使用右表的数据扩充原始 。所以下面的代码必须返回一行。
select u.*, p.*
from (
select 1 as id
) u
left join (
-- no data at all
select 2 as id where 1=2
) p on 3 = 4 -- never is true