帮助SQL连接两个表

时间:2010-03-17 01:53:38

标签: sql join

我有两个表,一个是论坛帖子的表。它有一个最后的发布日期列。

另一个表有PostID,UserId和DateViewed。

我想加入这些表,以便我可以为当前用户比较DateViewed和LastPostDate。但是,如果他们从未查看过该帖子,那么第二张表中就不会有一行。

这似乎很容易,但我无法绕过它。建议请。

提前致谢。

3 个答案:

答案 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