我有以下查询,它会返回两个用户之间的对话历史记录以及他们的个人资料图片。
SELECT m.Id, p.Id [SenderId], mr.RecipientId, p.Username, m.[Message], p.LastLoggedIn, p.LoggedIn, up.PhotoId, @UserId [UserId], m.SentDate
FROM [User].[User_Profile] p
INNER JOIN [User].[User_Details] d on p.Id = d.UserId
INNER JOIN [User].[User_Photos] up on p.Id = up.UserId
INNER JOIN [MailBox].[Message] m on p.Id = m.SenderId
INNER JOIN [MailBox].[MessageRecipient] mr on m.Id = mr.MessageId
WHERE
(p.id = @UserId or p.id = @SenderId)
AND
up.IsProfilePic = 1
AND (mr.RecipientId = @UserId and m.SenderId = @SenderId or m.SenderId = @UserId and mr.RecipientId = @SenderId)
AND p.ProfileStatus = 4
AND NOT EXISTS(SELECT UserId FROM [User].[Block_List]
WHERE DateBlocked is not null
AND(
(BlockedById = @UserId and UserId = p.Id)
OR
(BlockedById = p.Id and UserId = @UserId)
))
AND mr.DeletedDate is null
order by m.Id
正如你所看到的,我已经指定了up.IsProfilePic = 1如果两个用户都设置了个人资料图片,但如果其中任何一个没有设置个人资料图片,那么我需要为该特定用户返回null两者,因为目前它只返回1个用户,因为另一个用户没有设置个人资料图片。
现在,用户照片表可以包含每个用户10张以上的照片,如果他们没有上传任何照片,则甚至可以包含0张照片。我感兴趣的photoId是IsProfilePic = 1,如果没有设置或没有该特定用户的照片然后为PhotoId返回null但我可以想到我的生活如何实现这一点,我试着说< / p>
isnull(up.PhotoId, 'NoPhoto')
在select语句中但似乎也没有用,任何帮助都会非常感激。
答案 0 :(得分:4)
在照片表上进行左连接,并将条件放在on
子句中:
LEFT JOIN [User].[User_Photos] up ON p.Id = up.UserId AND up.IsProfilePic = 1
如果有的话,这将与个人资料图片匹配,否则您将获得该记录的该字段的空值。
通过将条件放在on
子句中,它将限制加入的记录或限制整个结果。
答案 1 :(得分:0)
为什么你们同时拥有@UserId和@SenderId?你应该有1并将别名p重命名为pSender,并重命名为upSender(因为你已经在m.SenderId上加入了它,你应该让别名表名明确为你的发件人的照片。
你的User_Photos表也可以是LEFT JOIN而不是内连接,否则当没有记录时你的查询将不返回任何内容。 INNER JOIN [用户]。[User_Photos]
并将[MailBox]。[Message] m作为您的第一个FROM项目,因为它是最重要的。
尝试这些事情,然后看看你如何去。