我有3个表:帖子,用户和收藏夹
Post
----------
PostId
Nombre
UserId
Banned
User
----------
UserId
UserName
Info
Favorites
-----------
PostId
UserId
我正在尝试获取所有帖子并告知帖子是否为收藏夹,因此如果帖子不在收藏夹中,它将显示在查询中,但收藏标志将为false。
这是我的疑问:
SELECT
p.Nombre as title,
CASE ISNULL(f.PostId,0) WHEN 0 THEN 'false' ELSE 'true' END as favorito
FROM Post p
inner join User u on p.UserId = u.UserId
left outer join Favorite f on p.PostId = f.PostId
where
p.Banned = 0
并返回所有内容,并告知收藏夹中是否有记录,但是当我在哪里添加过滤器
and f.UsuarioId = 4
仅返回用户喜欢的帖子。不应该在使用左外连接或全外连接时,如果辅助表中的记录不存在,则应该从主表返回记录吗?
¿如何在辅助表上返回所有使用过滤器的帖子?谢谢!
答案 0 :(得分:1)
由于您已对f.UsuarioId = 4
进行了过滤,因此要求LEFT OUTER JOIN
具有特定值的记录,从而有效地将INNER JOIN
转换为Favorite
。要仍然返回所有没有相关Favorite
的内容,您必须在该表中测试NULL
:
SELECT
p.Nombre as title,
CASE ISNULL(f.PostId,0) WHEN 0 THEN 'false' ELSE 'true' END as favorito
FROM
Post p
INNER JOINUser u ON p.UserId = u.UserId
LEFT OUTER JOIN Favorite f ON p.PostId = f.PostId
WHERE
p.Banned = 0
-- Return either those related Favorite records for UsuarioId = 4 or the NULLs
-- meaning a related record does not exist
AND (f.UsuarioId = 4 OR f.UsuarioId IS NULL)