Mysql 如何在Rails中按只计算组中的某些行

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:

在我正在构建的应用程序中,有post和tag,它们通过多对多关系进行连接。我想做的是向用户显示所有标记,并根据它们发布的帖子数量对它们进行排序(这由posts表中的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

假设列
已发布
的数据类型为
布尔型
整数型
,值为
1
0
,您可以按值之和排序:

ORDER BY SUM(posts.is_published) DESC
如果
已发布
可为空,请使用
COALESCE()

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