Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 按关联排序时设置默认值_Sql_Ruby On Rails_Ruby_Postgresql - Fatal编程技术网

Sql 按关联排序时设置默认值

Sql 按关联排序时设置默认值,sql,ruby-on-rails,ruby,postgresql,Sql,Ruby On Rails,Ruby,Postgresql,背景: 我正在使用Rails和Postgres制作一个简单的黑客新闻克隆。我已经完成了大部分工作,目前我正致力于允许网站访问者按分数对文章进行排序。就目前情况而言,我认为它基本上是有效的。以下是相关代码: Article.选择Articles.*,将案例投票数相加。如果为FALSE,则为-1,否则1作为分数结束 .joinsLEFT-JOIN-voces-ON-articles.id=投票数.votable_-id和投票数.votable_-type='Article' .grouparticl

背景:

我正在使用Rails和Postgres制作一个简单的黑客新闻克隆。我已经完成了大部分工作,目前我正致力于允许网站访问者按分数对文章进行排序。就目前情况而言,我认为它基本上是有效的。以下是相关代码:

Article.选择Articles.*,将案例投票数相加。如果为FALSE,则为-1,否则1作为分数结束 .joinsLEFT-JOIN-voces-ON-articles.id=投票数.votable_-id和投票数.votable_-type='Article' .grouparticles.id .orderscore描述

正如您可能知道的,这有一个问题:没有分数的文章没有正确排序至少有一个问题——无论如何,我不是SQL专家。例如,如果我有分数为2、-1、5和0的文章,顺序将是0、5、2、-1,而不是正确的顺序5、2、0、-1

问题:

我认识到,最简单/最好的方法可能是在文章上加一个分数栏,我很可能会这样做,但这让我很好奇:有没有办法给没有关联投票的文章默认0分

更新1:

根据建议,我已将select语句更改为:

Article.selectarticles.*,合并案例投票总数。如果为FALSE,则为-1,否则为1,结束,0为分数

然而,这丝毫没有改变结果

更新2:

运行查询时生成的SQL:

选择文章。*,合并案例投票。如果为FALSE,则为-1,否则1结束,0作为分数 从文章左侧,在articles.id=vows.votable_id和vows.votable_type='Article'上连接投票 按项目分组。id 按分数顺序描述 限制20 偏移量0


您还可以看到我用于分页的限制和偏移量—我最初没有提到这一点,因为我希望它不相关。

看起来您刚刚得到NULL,因此需要合并将其转换为0

Article.select(
  "articles.*, COALESCE(SUM( CASE votes.is_up WHEN FALSE THEN -1 ELSE 1 END ), 0) AS score")
...

做一个左外连接和合并,0我以前从未遇到过合并,谢谢!从博士后的医生看来,这绝对是我想要的。你建议把左边的连接放在哪里?谢谢!使用COALESCE显然是正确的选择。然而,我得到了与以前完全相同的行为,在看了博士后的医生后,我感到惊讶。“有什么想法吗?”安德里亚听起来很奇怪。你能看到生成的SQL吗?我用生成的SQL更新了主帖。再次感谢!