左外连接加入条件

时间:2018-01-20 06:28:34

标签: mysql sql

假设我有以下架构

users
+-------+------------+
| Field | Type       |
+-------+------------+
| id    | integer    |
+-------+------------+


posts
+---------+-------------+
| Field   | Type        |
+---------+-------------+
| id      | integer     | 
| user_id | integer     |
| topic   | varchar(255)|
+---------+-------------+

如何查找从未创建过关于Cats的帖子的所有用户?我尝试了这个查询,但它没有用。

SELECT    users.* 
FROM      users 
LEFT JOIN posts 
ON        users.id = posts.user_id 
WHERE     posts.user_id IS NULL 
AND       posts.topic LIKE 'Cats'

即使有用户从未发布过" Cats"

,也会返回一个空集。

4 个答案:

答案 0 :(得分:3)

这将解决您的问题,请尝试让我知道是否有帮助

SELECT * FROM `users` INNER JOIN posts ON users.id=posts.user_id WHERE users.id NOT IN(SELECT users.id FROM `users` LEFT JOIN posts ON users.id=posts.user_id WHERE posts.topic LIKE '%cats%')

答案 1 :(得分:2)

json_encode

答案 2 :(得分:0)

这可能会有所帮助:SELECT users.* FROM posts LEFT JOIN users ON posts.user_id = users.id WHERE posts.topic NOT LIKE %Cats% ;

答案 3 :(得分:0)

您需要将LIKE条件添加到on子句。

SELECT    users.* 
FROM      users 
LEFT JOIN posts 
ON        users.id = posts.user_id  
AND       posts.topic LIKE 'Cats'
WHERE     posts.user_id IS NULL

其他大多数答案都错误地在WHERE子句中使用NOT LIKE,但这将返回任何没有猫的帖子的用户。因此,如果用户发布了关于猫的信息,但也发布了一些不涉及猫的信息,则会在这些查询中错误地返回。