假设我有一个包含内容的表:
内容(contentID,title,body,privacyType)
隐私类型可以是:
Public = 1(任何人都可以查看) 私有= 2(只有作者可以查看) 朋友= 3(只有朋友可以查看)
我有一个用户表:
用户(userID,用户名)
我有一个供用户朋友使用的映射表:
好友(userID,friendID)
现在,当我列出所有内容时,应列出公开的内容或我是该用户的朋友(对于已登录的用户)
我该如何查询?
答案 0 :(得分:4)
您没有提供存储内容作者身份的字段,因此我假设它是content.author
:
SELECT *
FROM content
WHERE public = 1
OR
(
public = 3
AND EXISTS
(
SELECT NULL
FROM friends
WHERE userId = @me
AND friendID = content.author
)
)
,或更好的这个:
SELECT *
FROM content
WHERE public = 1
UNION ALL
SELECT *
FROM content
WHERE public = 3
AND EXISTS
(
SELECT NULL
FROM friends
WHERE userId = @me
AND friendID = content.author
)
,如果您的author
字段是选择性的,并且排序比过滤便宜。
另请注意,如果您的友谊是对称关系(即userA
是userB
的朋友,那么userB
是userA
的朋友),那就是最好存储在这样的表中:
userA userB
带检查约束的:
userA < user B
Yuo总是先将用户放在id
之前。
在这种情况下,您的查询如下:
SELECT *
FROM content
WHERE public = 1
UNION ALL
SELECT *
FROM content
WHERE public = 3
AND EXISTS
(
SELECT NULL
FROM friends
WHERE userA = @me
AND userB = content.author
UNION ALL
SELECT NULL
FROM friends
WHERE userB = @me
AND userA = content.author
)