返回记录或null

时间:2015-08-13 10:22:11

标签: sql sql-server sql-server-2008

我有以下查询,它会返回两个用户之间的对话历史记录以及他们的个人资料图片。

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语句中但似乎也没有用,任何帮助都会非常感激。

2 个答案:

答案 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项目,因为它是最重要的。

尝试这些事情,然后看看你如何去。