由不阻止sql server的用户返回行

时间:2015-08-04 23:44:46

标签: sql-server sql-server-2008

我目前正在为我的网络应用程序实施阻止功能。用户可以选择阻止其他用户。

我目前的表格设置如下:

CREATE TABLE [User].[Block_List]
(
    [Id] [bigint] IDENTITY(1,1) NOT NULL,
    [UserId] [bigint] NOT NULL, -- Person that I have blocked
    [BlockedById] [bigint] NOT NULL, -- Person who requested the block
    [DateBlocked] [datetime] NOT NULL,
    [DateUnblocked] [datetime] NULL
)

现在,在我的存储过程中,我正在加入此表,以过滤掉我已阻止的人,如下所示:

 SELECT 
     p.Id [SenderId], 
     p.Username, 
     COUNT(mr.RecipientId) [TotalMessages], 
     COUNT(CASE WHEN mr.ReadDate IS NULL THEN 1 END) AS [NewMessages],
     up.PhotoId, 
     p.LastLoggedIn, 
     p.LoggedIn,
     MAX(m.SentDate)[EmailDate]
 FROM 
     [User].[User_Profile] p
 JOIN 
     [MailBox].[Message] m ON p.Id = m.SenderId
 JOIN 
     [MailBox].[MessageRecipient] mr ON m.Id = mr.MessageId
 LEFT JOIN 
     [User].[User_Photos] up ON p.Id = up.UserId AND up.isProfilePic = 1
 LEFT JOIN 
     [User].[Block_List] b ON p.Id = b.UserId
 WHERE 
     mr.RecipientId = 1 --and mr.DeletedDate is null
     AND (b.BlockedById = 1 and p.Id != b.UserId) -- Checking blocked table
 GROUP BY 
     p.id, p.Username, mr.RecipientId, up.PhotoId, p.LastLoggedIn, p.LoggedIn

我已将BlockedbyId硬编码为1,因为这是我当前的ID,不幸的是,当我希望它返回至少一行时,它不会返回任何行,原因是我有两个记录,我只阻止其中一个。

当我执行上面的存储过程而没有使用blocking where子句时,我得到以下内容:

enter image description here

在我的被阻止的表格中,我阻止了ID为2的用户,如下所示:

enter image description here

当我添加阻止where子句时,我希望看到UserId 21的记录,但不幸的是我没有得到任何记录。

任何帮助都会很棒

2 个答案:

答案 0 :(得分:1)

您在此处设置了一些互斥条件。您的加入说

p.Id = b.UserId

然而where子句也说

p.Id != b.UserId

因此,当你将它们组合起来时,你将没有任何行。

答案 1 :(得分:1)

以下部分

LEFT JOIN [User].[Block_List] b on p.Id = b.UserId
WHERE mr.RecipientId = 1 --and mr.DeletedDate is null
AND (b.BlockedById = 1 and p.Id != b.UserId) -- Checking blocked table

应替换为

WHERE mr.RecipientId = 1
AND m.SenderId NOT IN (SELECT UserId FROM [User].[Block_List] WHERE BlockedById = 1)

特别是如果你想要计算我在加入一张桌子时会非常小心,因为如果之后没有正确过滤掉你可能会得到太多的组合,在可能的情况下使用where子句在我看来更安全,除非你真的想加入并使用这些价值观。