2010-03-17 83 views
2

我有兩個表,一個是論壇線程表。它有最後的發佈日期列。幫助SQL在兩個表上加入

另一個表具有PostID,UserId和DateViewed。

我想加入這些表,所以我可以爲當前用戶比較DateViewed和LastPostDate。但是,如果他們從未查看過線程,則第二個表中不會有一行。

這似乎很容易,但我不能包裹我的頭。建議請。

在此先感謝。

+0

嘗試左連接。一直在使用左外部 – bladefist 2010-03-17 01:58:24

+0

'外部'是多餘的。這與'LEFT JOIN'完全相同。 – Aaronaught 2010-03-17 02:01:12

+0

這些都是一樣的。 – 2010-03-17 02:01:16

回答

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 

請注意,我已經放置在JOIN條件UserID測試;如果將它放在WHERE謂詞中,那麼您將得不到結果,因爲PostViews表中將沒有匹配的行。

+0

這工作完美謝謝 – bladefist 2010-03-17 02:05:41

+0

好吧,好...我正在重讀您的問題,並且感到困惑,因爲我找不到線程和帖子之間的任何連接,但我猜測你知道了! – Aaronaught 2010-03-17 02:07:31

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; 
+0

表t沒有userid。 UserId只在表中持有上次查看線程的時間。 這將應用在執行時的位置 – bladefist 2010-03-17 02:02:48

0

的關鍵是使用LEFT JOIN,這將導致不存在行右側上來因爲所有NULL

SELECT threads.lastpostdate, posts.dateviewed 
FROM threads 
LEFT JOIN posts 
    ON threads.id=posts.postid