Sql ActiveRecord:使用组计数

Sql ActiveRecord:使用组计数,sql,ruby-on-rails,activerecord,Sql,Ruby On Rails,Activerecord,我有一个带有评论的帖子模型。每个帖子都有一个线程id(但没有名为thread的模型) 因此,如果我想计算这篇文章中的线程数,我会喜欢smth > post.comments.count(:thread, :distinct => true) SELECT COUNT(DISTINCT "comments"."thread") FROM "comments" WHERE "comments"."post_id" = 3 这个很好用。但是,如果我只想用一条注释来计算线程的数量,该怎么办

我有一个带有
评论的帖子模型。每个帖子都有一个线程id(但没有名为thread的模型)

因此,如果我想计算这篇文章中的线程数,我会喜欢smth

> post.comments.count(:thread, :distinct => true)
SELECT COUNT(DISTINCT "comments"."thread") FROM "comments" WHERE "comments"."post_id" = 3
这个很好用。但是,如果我只想用一条注释来计算线程的数量,该怎么办

> post.comments.group(:thread).having('COUNT(*) == 1').count
SELECT COUNT(*) AS count_all, thread AS thread FROM "comments" WHERE "comments"."post_id" = 3 GROUP BY thread HAVING COUNT(*) == 1 ORDER BY id
所以我有一个OrderedHash而不是整数。我必须做不必要的步骤

> post.comments.group(:thread).having('COUNT(*) == 1').count.count

有更好的解决方案吗?

这是预期的行为

post.comments.group(:thread).having('COUNT(*) == 1').count
这将返回一个散列,其中键是线程id,值是计数。我相信,只要您在rails中使用聚合函数创建一个组,就会出现这种情况。必须进行第二次计数,以获得第一次查询匹配的结果数

我不确定这在Rails中会是什么样子,但以下是我认为您需要的SQL:

SELECT COUNT(*) FROM 
  SELECT COUNT(*) AS count_all, thread AS thread 
  FROM "comments"
  WHERE "comments"."post_id" = 3 
  GROUP BY thread
  HAVING COUNT(*) == 1
  ORDER BY id

通常,SQL期望“=”而不是“==”表示等价性。对于某些品牌的SQL,您的答案可能是正确的,但如果没有此更改,它在MySQL上确实会失败。这是正确的。然而,我试图与他在原始帖子中使用的格式保持一致。