代码之家  ›  专栏  ›  技术社区  ›  bladefist

有关两个表上的SQL联接的帮助

  •  2
  • bladefist  · 技术社区  · 15 年前

    我有两张桌子,一张是论坛主题的桌子。它有最后一个发布日期列。

    另一个表具有postid、userid和dateview。

    我想加入这些表,以便可以比较当前用户的日期查看日期和最后发布日期。但是,如果他们从未查看过线程,那么第二个表中将没有行。

    这看起来很容易,但我不能把我的头绕起来。请给我建议。

    事先谢谢。

    3 回复  |  直到 15 年前
        1
  •  2
  •   Aaronaught    15 年前

    你想做的是什么——确定是否有未读的帖子?

    您只需要使用外部联接:

    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 表。

        2
  •  1
  •   Rob Farley    15 年前

    所以你想的是:

    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.dateview将为空。

    如果视图中有很多行,您可能更喜欢这样做:

    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;
    
        3
  •  0
  •   Ignacio Vazquez-Abrams    15 年前

    关键是要使用 LEFT JOIN ,这将导致右侧不存在的行全部出现 NULL :

    SELECT threads.lastpostdate, posts.dateviewed
    FROM threads
    LEFT JOIN posts
      ON threads.id=posts.postid
    
    推荐文章