MySQL在左连接条件下不为空

时间:2017-06-13 11:10:50

标签: mysql sql left-join

我的查询如下:

$(".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条件。

5 个答案:

答案 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 INNOT 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