Mysql 如何在Rails中按只计算组中的某些行
在我正在构建的应用程序中,有post和tag,它们通过多对多关系进行连接。我想做的是向用户显示所有标记,并根据它们发布的帖子数量对它们进行排序(这由posts表中的is_published列确定) 现在,我正在按照他们的帖子数量(包括已发布和未发布)对他们进行排序,代码如下:Mysql 如何在Rails中按只计算组中的某些行,mysql,ruby-on-rails,activerecord,ruby-on-rails-6,Mysql,Ruby On Rails,Activerecord,Ruby On Rails 6,在我正在构建的应用程序中,有post和tag,它们通过多对多关系进行连接。我想做的是向用户显示所有标记,并根据它们发布的帖子数量对它们进行排序(这由posts表中的is_published列确定) 现在,我正在按照他们的帖子数量(包括已发布和未发布)对他们进行排序,代码如下: scope :top_used, -> { left_joins(:posts).group(:id).order("COUNT(posts.id) DESC") } 这可以转化为MySQL:
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
?假设列
已发布
的数据类型为布尔型
或整数型
,值为1
或0
,您可以按值之和排序:
ORDER BY SUM(posts.is_published) DESC
如果已发布
可为空,请使用COALESCE()
:
ORDER BY COALESCE(SUM(posts.is_published), 0) DESC