我有兩個表,一個是論壇線程表。它有最後的發佈日期列。幫助SQL在兩個表上加入
另一個表具有PostID,UserId和DateViewed。
我想加入這些表,所以我可以爲當前用戶比較DateViewed和LastPostDate。但是,如果他們從未查看過線程,則第二個表中不會有一行。
這似乎很容易,但我不能包裹我的頭。建議請。
在此先感謝。
我有兩個表,一個是論壇線程表。它有最後的發佈日期列。幫助SQL在兩個表上加入
另一個表具有PostID,UserId和DateViewed。
我想加入這些表,所以我可以爲當前用戶比較DateViewed和LastPostDate。但是,如果他們從未查看過線程,則第二個表中不會有一行。
這似乎很容易,但我不能包裹我的頭。建議請。
在此先感謝。
什麼是你試圖做的具體 - 確定是否有未讀的帖子?
你只需要使用一個外連接:
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
表中將沒有匹配的行。
這工作完美謝謝 – bladefist 2010-03-17 02:05:41
好吧,好...我正在重讀您的問題,並且感到困惑,因爲我找不到線程和帖子之間的任何連接,但我猜測你知道了! – Aaronaught 2010-03-17 02:07:31
所以你在想是這樣的:
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;
表t沒有userid。 UserId只在表中持有上次查看線程的時間。 這將應用在執行時的位置 – bladefist 2010-03-17 02:02:48
的關鍵是使用LEFT JOIN
,這將導致不存在行右側上來因爲所有NULL
:
SELECT threads.lastpostdate, posts.dateviewed
FROM threads
LEFT JOIN posts
ON threads.id=posts.postid
嘗試左連接。一直在使用左外部 – bladefist 2010-03-17 01:58:24
'外部'是多餘的。這與'LEFT JOIN'完全相同。 – Aaronaught 2010-03-17 02:01:12
這些都是一樣的。 – 2010-03-17 02:01:16