我有两个表,一个是论坛帖子的表。它有一个最后的发布日期列。
另一个表有PostID,UserId和DateViewed。
我想加入这些表,以便我可以为当前用户比较DateViewed和LastPostDate。但是,如果他们从未查看过该帖子,那么第二张表中就不会有一行。
这似乎很容易,但我无法绕过它。建议请。
提前致谢。
答案 0 :(得分:2)
你要特意做的是什么 - 确定是否有未读帖子?
您只需要使用外部联接:
SELECT p.PostID, p.LastPostDate, ...,
CASE
WHEN v.DateViewed IS NULL OR v.DateViewed < p.LastPostDate THEN 1
ELSE 0
END AS Unread
FROM Posts p
LEFT JOIN PostViews v
ON v.PostID = p.PostID
AND v.UserID = @UserID
请注意,我已将UserID
测试置于JOIN
条件下;如果你将它放在WHERE
谓词中,那么你将得不到任何结果,因为PostViews
表中没有匹配的行。
答案 1 :(得分:1)
所以你想的是:
SELECT t.UserID, t.PostID, t.LastPostDate, v.DateViewed
FROM dbo.Threads t
LEFT JOIN dbo.Views v ON v.PostID = t.PostID
AND v.UserID = t.UserID
WHERE t.UserID = @user;
如果视图中没有对应的行,则v.DateViewed将为NULL。
如果视图中有很多行,您可能更愿意执行以下操作:
SELECT t.UserID, t.PostID, t.LastPostDate, v.DateViewed
FROM dbo.Threads t
CROSS APPLY (SELECT MAX(vw.DateViewed) as DateViewed
FROM dbo.Views vw
WHERE vw.PostID = t.PostID
AND vw.UserID = t.UserID
) v
WHERE t.UserID = @user;
答案 2 :(得分:0)
关键是使用LEFT JOIN
,这会导致右侧不存在的行显示为所有NULL
:
SELECT threads.lastpostdate, posts.dateviewed
FROM threads
LEFT JOIN posts
ON threads.id=posts.postid