2

我有 3 个表:帖子、用户和收藏夹

Post
----------
PostId
Nombre
UserId
Banned

User
----------
UserId
UserName
Info

Favorites
-----------
PostId
UserId

我正在尝试获取所有帖子并判断帖子是否是收藏夹,因此如果帖子不在收藏夹中,它将出现在查询中,但收藏夹标志将为假。

这是我的查询:

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 

它返回所有内容,并告诉收藏夹中是否有记录,但是当我在 where 部分添加过滤器时

 and f.UsuarioId = 4

只返回用户喜欢的帖子。不应该在使用左外连接或完全外连接时,如果辅助表中的记录不存在,则无论如何都应该返回主表中的记录?

¿如何使用辅助表上的过滤器返回所有帖子?谢谢!

4

1 回答 1

2

由于您已过滤,因此通过要求具有特定值的记录f.UsuarioId = 4,有效地将 转换LEFT OUTER JOIN为。要仍然返回所有没有相关的 ,您必须在该表中测试 a :INNER JOINFavoriteFavoriteNULL

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)
于 2013-04-24T20:11:18.433 回答