微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何仅计算 Rails 中 GROUP BY 中的某些行

如何解决如何仅计算 Rails 中 GROUP BY 中的某些行

在我正在构建的应用程序中,有帖子和标签,它们通过多对多关系连接。我想要做的是向用户显示所有标签,并按照他们发布的帖子数量(由帖子表中的 is_published 列确定)对它们进行排序。

现在,我正在使用以下代码按他们拥有的一般帖子(已发布和未发布)的数量对它们进行排序:

scope :top_used,-> { left_joins(:posts).group(:id).order("COUNT(posts.id) DESC") }

翻译成 MysqL

SELECT t.* 
  FROM tags t
  LEFT 
  JOIN post_tags pt
    ON pt.tag_id = tags.id 
  LEFT 
  JOIN posts p
    ON p.id = pt.post_id 
 GROUP 
    BY t.id  
 ORDER 
    BY COUNT(p.id) DESC

所以,同样,我需要按已发布帖子的数量而不是所有帖子进行排序。这可以在 MysqL 中完成吗?

解决方法

也许是这样:

SELECT `tags`.* FROM `tags` 
LEFT OUTER JOIN `post_tags` ON `post_tags`.`tag_id` = `tags`.`id` 
LEFT OUTER JOIN `posts` ON `posts`.`id` = `post_tags`.`post_id` AND posts.is_published = 1
GROUP BY `tags`.`id` 
ORDER BY COUNT(posts.id) DESC

,

假设列 is_published 的数据类型是 BooleanInteger,值 10 您可以按总和排序值:

ORDER BY SUM(posts.is_published) DESC

如果 is_published 可为空,则使用 COALESCE()

ORDER BY COALESCE(SUM(posts.is_published),0) DESC

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。