MySQL 在左连接条件中不为空

标签 mysql sql left-join

我的查询如下:

   SELECT * 
     FROM users U 
LEFT JOIN posts P ON P.userId = U.id AND P.userId IS NOT NULL;

为什么查询还返回 userIdnull 的结果?

我知道根据我的需要,我可以使用 INNER JOIN 来仅获取与用户相关的帖子,但是很奇怪 LEFT JOIN 支持多种条件,但无法使用NOT NULL 条件。

最佳答案

这是因为“帖子”不包含空值,因此无法在该阶段进行过滤。当服务器无法在右表中找到相应的行时,只会通过连接生成 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;

关于MySQL 在左连接条件中不为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44519892/

相关文章:

sql - 使用CASE和GROUP BY进行数据透视的动态替代方案

php - sql php通过if语句插入表

MySQL连接查询帮助

mysql - 如何更新包含逗号分隔值的表行?

javascript - 记住跨多个页面的 javascript 变量

mysql - 如何检查子查询什么都不返回?

python - 如何返回缺失数据计数为 0 的行?

Django 查询空的related_set

where 子句中带有 like %..% 的 mysql 查询返回不同的结果

mysql 无法在 xampp 上启动