如何仅计算 Rails 中 GROUP BY 中的某些行
How to count only certain rows in a GROUP BY in Rails
在我正在构建的应用程序中,有帖子和标签,它们通过多对多关系连接。我想要做的是向用户显示所有标签,并根据他们发布的帖子数量对它们进行排序(由帖子 table 中的 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
的数据类型为Boolean
或Integer
,值为1
或0
,您可以按总和排序的值:
ORDER BY SUM(posts.is_published) DESC
如果 is_published
可以为空,则使用 COALESCE()
:
ORDER BY COALESCE(SUM(posts.is_published), 0) DESC
在我正在构建的应用程序中,有帖子和标签,它们通过多对多关系连接。我想要做的是向用户显示所有标签,并根据他们发布的帖子数量对它们进行排序(由帖子 table 中的 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
的数据类型为Boolean
或Integer
,值为1
或0
,您可以按总和排序的值:
ORDER BY SUM(posts.is_published) DESC
如果 is_published
可以为空,则使用 COALESCE()
:
ORDER BY COALESCE(SUM(posts.is_published), 0) DESC