SQL ORDER BY除了表之一之外的其他内容

时间:2014-07-31 11:39:50

标签: sql

我有一张桌子上有帖子。网站访问者可以对此类帖子进行upvote或downvote。我想按帖子的分数订购某个sql查询,但我的posts表没有score列 - 我将upvotes和downvotes保存在不同的votes表中,因为那告诉我谁投了什么。我可以在score表格中添加posts列,并在每次有人在帖子上投票时更新它,但我宁愿不这样做,因为分数是我可以通过减去无论如何,来自upvotes的downvotes。

你有什么建议吗?或者我应该继续向我的表添加score列?

修改

我的posts表格包含post_id列(以及其他不相关的列),而我的votes表格列有post_iduser_id和{{1} (后者是一个BOOLEAN,当投票是upvote时为1,投票为downvote时为0)。

我可以通过首先查询该帖子的赞成票数量,然后是downvotes的数量,并计算它们的差异,轻松确定帖子'得分'的得分。但是,我想查询我的positive表并按该帖子的分数排序,所以我想知道如何/如果我可以在posts命令中查询votes表查询ORDER BY表。

3 个答案:

答案 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)添加基于函数的索引。

修改: 根据有关postsvotes表的更新信息,可以使用以下查询。使用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。您可以根据特定数据结构调整逻辑。