2010-12-09 59 views
0

我有一個博客文章表 - 每篇文章給出了分數。用戶可以對帖子進行投票,這會增加或減少分數。SQL Server WHERE子句時重複

我只希望用戶能夠在帖子上投票一次,所以我有一個投票表,其中userIdpostId。當用戶試圖投票時,它首先檢查他們是否已經投票。他們不能再投票,但他們可以「解除」投票或反轉投票。類似於SO。

現在,這一切都很好,但是當頁面顯示時,我想向用戶顯示他們投了些什麼帖子。像SO顯示你的投票。

我從帖子表中選擇帖子,並在投票表中留下外部聯合,以便我可以檢查用戶是否投了票。

SELECT * FROM ( 
    SELECT row_number() over (ORDER BY CreationDate DESC) AS rn, * 
    FROM (
    SELECT p.id, ownerUserId, p.CreationDate, COUNT(p.id) over (partition BY NULL) AS totalRecordCount, v.voteType 
     FROM Posts p 
    LEFT OUTER JOIN Votes v on p.id = v.postId 
    ) x 
) y 
WHERE 
rn BETWEEN 1 AND 20 

這現在給我的職位,但他們包含每個投票重複的條目。我不能有這個,因爲它打破了我的分頁。

我嘗試添加:

WHERE (v.userId = 1234 OR v.userId IS NULL) 

它並沒有真正的工作,因爲很明顯這並不表明,目前用戶還沒有投票帖子,但別人了。

你知道我該怎麼做到這一點嗎?它可以在一個查詢中完成嗎?

編輯:

以上查詢是減少版本。基本上查詢返回的帖子。而已。然後我在頁面上顯示一個voteUpButton和voteDownButton,用戶用它來投票。我想要的是檢查用戶是否對帖子投了票,並通過使按鈕變大來顯示該投票。

那麼,我顯示按鈕,我想要做的事,如:

if (session.userObj.isLoggedIn() && len(postBoObj.get("voteType")) && postBoObj.get("voteType") == upVote) { 
    //show big up button 
else 
    //show normal up button 

的voteType存儲在投票表格,所以當我加入後表和表決表,並增加了我的「WHERE (v.userId = 1234或v.userId IS NULL)「我可以假設如果voteType存在,那麼當前登錄用戶已經對該帖子投了票。但正如我所提到的,這將只顯示用戶投票的帖子,或者沒有用戶投票。如果有其他用戶投票的帖子,那麼「WHERE(v.userId = 1234或v.userId IS NULL)」將排除它,帖子將永遠不會被看到。

我希望我已經解釋了我自己。我基本上想要什麼Stackoverflow。當我點擊一個問題時,我看到了我所做的任何投票。當喬博客遇到同樣的問題時,他看到了他的選票。

+0

你能表現出一定的樣本輸出,然後你想怎麼出現 – 2010-12-09 11:37:06

+0

的例子? voteTable =投票 – msi77 2010-12-09 11:38:36

回答

1

此舉附加條件到您的加盟:

SELECT * FROM ( 
    SELECT row_number() over (ORDER BY CreationDate DESC) AS rn, * 
    FROM (
    SELECT p.id, ownerUserId, p.CreationDate, COUNT(p.id) over (partition BY NULL) AS totalRecordCount, v.voteType 
     FROM Posts p 
    LEFT OUTER JOIN Votes v on p.id = v.postId AND v.UserID = 1234 /* <-- New bit here */ 
    ) x 
) y 
WHERE 
rn BETWEEN 1 AND 20