SQL Server WHERE子句重复时

时间:2010-12-09 11:29:15

标签: sql sql-server

我有一个博客文章表 - 每个帖子都有一个分数。用户可以对帖子进行投票,这将增加或减少分数。

我只希望用户能够在帖子上投票一次,因此我有一张包含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存储在投票表中,所以当我加入post表和投票表,并添加了我的“WHERE(v.userId = 1234或v.userId IS NULL)”时,我可以假设如果voteType存在则当前登录的用户已对该帖子进行了投票。但正如我所提到的,这只会显示用户投票的帖子,或者没有用户投票。如果有其他用户已投票的帖子,那么“WHERE(v.userId = 1234或v.userId IS NULL)”将排除它并且永远不会看到该帖子。

我希望我已经解释过自己好了。我基本上想要Stackoverflow的功能。当我点击一个问题时,我看到我所做的任何选票。当Joe Blogs遇到同样的问题时,他会看到他的投票。

1 个答案:

答案 0 :(得分:1)

将其他条件移至您的JOIN:

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