我有一张桌子上有帖子。网站访问者可以对此类帖子进行upvote或downvote。我想按帖子的分数订购某个sql查询,但我的posts
表没有score
列 - 我将upvotes和downvotes保存在不同的votes
表中,因为那告诉我谁投了什么。我可以在score
表格中添加posts
列,并在每次有人在帖子上投票时更新它,但我宁愿不这样做,因为分数是我可以通过减去无论如何,来自upvotes的downvotes。
你有什么建议吗?或者我应该继续向我的表添加score
列?
修改
我的posts
表格包含post_id
列(以及其他不相关的列),而我的votes
表格列有post_id
,user_id
和{{1} (后者是一个BOOLEAN,当投票是upvote时为1,投票为downvote时为0)。
我可以通过首先查询该帖子的赞成票数量,然后是downvotes的数量,并计算它们的差异,轻松确定帖子'得分'的得分。但是,我想查询我的positive
表并按该帖子的分数排序,所以我想知道如何/如果我可以在posts
命令中查询votes
表查询ORDER BY
表。
答案 0 :(得分:4)
不,您不必创建分数列。您可以按计算得分排序,如下所示:
由于你有一个不同的表中的upvotes和downvotes,你需要加入,正如Tim Schmelter解释的那样。
SELECT p.*
FROM Post p
INNER JOIN Votes v
ON p.PostID = v.PostID
ORDER BY (v.upvotes - v.downvotes);
如果要让查询更好地执行,可以为(v.upvotes - v.downvotes)
添加基于函数的索引。
修改强>:
根据有关posts
和votes
表的更新信息,可以使用以下查询。使用CASE
语句在内联视图中计算得分。然后,此内联视图与posts表连接,按分数对行进行排序。请注意,使用了INNER JOIN
,因此只会列出有投票的帖子。要列出所有帖子,可以使用LEFT JOIN
代替。
SELECT p.*
FROM posts p
INNER JOIN
(
SELECT
post_id,
SUM
(
CASE
WHEN positive = 0 THEN -1
ELSE 1
END
) score
FROM votes v
GROUP BY post_id
) scores
ON p.post_id = scores.post_id
ORDER BY scores.score;
答案 1 :(得分:2)
您必须通过JOIN
链接两个表格。假设Score
- 表有一列PostID
:
SELECT p.*, Score = s.Upvotes- s.DownVotes
FROM Post p
INNER JOIN Score s
ON p.PostID = s.PostID
ORDER BY Score
答案 2 :(得分:2)
据推测,您的数据有一个scores
表,其中包含每个投票的列,以及是否为投票或投票的指标。如果是这样,您需要汇总此信息,然后您可以将其用于订购:
select p.*, (NumUpVotes - NumDownVotes) as NetVotes
from posts p left outer join
(select PostId, sum(case when IsUpVote = 'Y' then 1 else 0 end) as NumUpvotes,
sum(case when IsDownVote = 'Y' then 1 else 0 end) as NumDownVotes
from scores s
group by PostId
) s
on p.postId = scores.PostId
order by (NumUpVotes - NumDownVotes);
您没有指定您正在使用的数据库,因此这使用了适用于任何数据库的标准SQL。您可以根据特定数据结构调整逻辑。