我有一个博客文章表 - 每个帖子都有一个分数。用户可以对帖子进行投票,这将增加或减少分数。
我只希望用户能够在帖子上投票一次,因此我有一张包含userId
和postId
的投票表。当用户试图投票时,它首先检查他们是否已经投票。他们不能再投票,但他们可以“不投票”或反对他们的投票。与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遇到同样的问题时,他会看到他的投票。
答案 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