Asp.net 将内容设置为仅可由朋友查看
假设我有一个包含内容的表: 内容(contentID、标题、正文、privacyType) 隐私类型可以是: Public=1(任何人都可以查看) Private=2(只有作者才能查看) Friends=3(只有朋友才能查看) 我有一个用户表: 用户(用户ID、用户名) 然后,我为用户朋友提供了一个映射表: 好友(userID,friendID) 现在,当我列出所有内容时,应该列出公开的内容,或者我是该用户的朋友(对于登录用户)Asp.net 将内容设置为仅可由朋友查看,asp.net,sql-server,Asp.net,Sql Server,假设我有一个包含内容的表: 内容(contentID、标题、正文、privacyType) 隐私类型可以是: Public=1(任何人都可以查看) Private=2(只有作者才能查看) Friends=3(只有朋友才能查看) 我有一个用户表: 用户(用户ID、用户名) 然后,我为用户朋友提供了一个映射表: 好友(userID,friendID) 现在,当我列出所有内容时,应该列出公开的内容,或者我是该用户的朋友(对于登录用户) 如何对此进行查询?您没有提供存储内容作者身份的字段,因此我假设它是
如何对此进行查询?您没有提供存储内容作者身份的字段,因此我假设它是
内容。作者
:
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
)
,如果您的作者
字段是选择性的,并且排序比筛选便宜
还请注意,如果您的友谊是对称关系(即如果auserA
是userB
的朋友,那么userB
是userA
的朋友),最好将其存储在如下表中:
userA userB
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
)
使用检查约束:
userA < user B
您没有提供存储内容作者身份的字段,因此我假定它是
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
)
,如果您的作者
字段是选择性的,并且排序比筛选便宜
还请注意,如果您的友谊是对称关系(即如果auserA
是userB
的朋友,那么userB
是userA
的朋友),最好将其存储在如下表中:
userA userB
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
)
使用检查约束:
userA < user B