Asp.net 将内容设置为仅可由朋友查看

Asp.net 将内容设置为仅可由朋友查看,asp.net,sql-server,Asp.net,Sql Server,假设我有一个包含内容的表: 内容(contentID、标题、正文、privacyType) 隐私类型可以是: Public=1(任何人都可以查看) Private=2(只有作者才能查看) Friends=3(只有朋友才能查看) 我有一个用户表: 用户(用户ID、用户名) 然后,我为用户朋友提供了一个映射表: 好友(userID,friendID) 现在,当我列出所有内容时,应该列出公开的内容,或者我是该用户的朋友(对于登录用户) 如何对此进行查询?您没有提供存储内容作者身份的字段,因此我假设它是

假设我有一个包含内容的表:

内容(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
        )
,如果您的
作者
字段是选择性的,并且排序比筛选便宜

还请注意,如果您的友谊是对称关系(即如果a
userA
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
        )
,如果您的
作者
字段是选择性的,并且排序比筛选便宜

还请注意,如果您的友谊是对称关系(即如果a
userA
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