【问题标题】:Sorting posts based on votes in a relational database?根据关系数据库中的投票对帖子进行排序?
【发布时间】:2014-12-25 10:21:45
【问题描述】:

我有两个数据库表。 帖子和投票。

**posts table;**
id | user_id |        content         
 1 |       1 | first post   
 2 |       1 | second post  
 3 |       1 | third                 

**votes table;**

 vote | post_id  
------+---------
 t    |       1
 t    |       2
 t    |       2
 t    |       2
 f    |       2
 t    |       3
 t    |       3
 t    |       3
vote is a boolean with values true or false

现在我想查找按降序排序的所有帖子,以便结果反映投票(赞成票数(真票)-反对票数(假票))。

SELECT  posts.*, count(votes.vote is true) -  count(votes.vote is false) as vote_count
FROM "posts"
LEFT JOIN votes AS votes ON votes.post_id = posts.id
GROUP BY posts.id 
ORDER BY vote_count DESC LIMIT 100;

上述查询返回结果,但 vote_count 字段中的所有值都是 0(零)。 (我知道我是个菜鸟!)

在这种情况下正确的查询是什么?

想要的结果是('()'内的值仅供参考):

 id | votes | content        
----+-----------------------
  3 | 3(3-0)| third 
  2 | 2(3-1)| second post
  1 | 1(1-0)| first post

谢谢。

附: - 如果您也可以给我相应的rails查询,将会有很大帮助。

【问题讨论】:

    标签: sql ruby-on-rails database relational-database


    【解决方案1】:

    尝试使用 CASE WHEN THEN 进行内部连接,如下所示:

    SELECT SUM(CASE WHEN vote = 't' then 1 ELSE -1 END) AS Votes, post_id, content
    FROM votes v INNER JOIN posts p ON p.id = v.post_id
    GROUP BY post_id
    ORDER BY SUM(CASE WHEN vote = 't' then 1 ELSE -1 END) DESC
    

    【讨论】:

    • 成功了!只需用“ON v.post_id = p.id”更正第二行。
    • 很高兴它的工作,并感谢提出它。我已经纠正了错字:)
    • 而且我们也可以将第 4 行中的 'SUM(CASE WHEN vote = 't' then 1 ELSE -1 END)' 替换为 'Votes',不会导致任何错误,对吧?
    • 不,你不能在那里使用别名。
    • SELECT SUM(CASE WHEN vote = 't' then 1 ELSE -1 END) AS votes, post_id FROM vote_posts v INNER JOIN posts p ON p.id = v.post_id GROUP BY post_id ORDER BY votes DESC 限制 100;正在工作中。也许是因为实际的数据库有点不同。 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-31
    • 2021-08-28
    • 2014-07-16
    • 1970-01-01
    • 1970-01-01
    • 2019-02-23
    相关资源
    最近更新 更多