2010-12-09 96 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