将内容设置为仅供朋友查看

时间:2009-07-23 14:56:03

标签: asp.net sql-server

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

内容(contentID,title,body,privacyType)

隐私类型可以是:

Public = 1(任何人都可以查看) 私有= 2(只有作者可以查看) 朋友= 3(只有朋友可以查看)

我有一个用户表:

用户(userID,用户名)

我有一个供用户朋友使用的映射表:

好友(userID,friendID)

现在,当我列出所有内容时,应列出公开的内容或我是该用户的朋友(对于已登录的用户)

我该如何查询?

1 个答案:

答案 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字段是选择性的,并且排序比过滤便宜。

另请注意,如果您的友谊是对称关系(即userAuserB的朋友,那么userBuserA的朋友),那就是最好存储在这样的表中:

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
        )