我目前正在为我的网络应用程序实施阻止功能。用户可以选择阻止其他用户。
我目前的表格设置如下:
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子句时,我得到以下内容:
在我的被阻止的表格中,我阻止了ID为2的用户,如下所示:
当我添加阻止where子句时,我希望看到UserId 21的记录,但不幸的是我没有得到任何记录。
任何帮助都会很棒
答案 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子句在我看来更安全,除非你真的想加入并使用这些价值观。