2

我想识别并计算具有特定数量的消息和 post.location 不为零的帖子。

我有大约 100k 行,它用于统计用途,所以我需要快速查询(顺便说一下,我可能必须索引 post.location)。

我怎样才能以最简单快捷的方式做到这一点?

这是我的架构:

create_table "posts", :force => true do |t|
  t.string   "ref"
  t.string   "title"
  t.string   "author"
  t.datetime "created_at"
  t.datetime "updated_at"
  t.string   "location"
  t.float    "lat"
  t.float    "long"
end

create_table "messages", :force => true do |t|
  t.integer  "post_id"
  t.integer  "status_id"
  t.integer  "user_id"
  t.string   "content"
  t.datetime "created_at"
  t.datetime "updated_at"
  t.float    "lat"
  t.float    "long"
end

add_index "messages", ["post_id"], :name => "index_messages_on_post_id"
add_index "messages", ["created_at"], :name => "index_messages_on_created_at"
4

3 回答 3

3

您正在寻找的 SQL 查询应该看起来很像这样:

SELECT COUNT(posts.id)
FROM posts
JOIN messages ON (posts.id = messages.post_id)
GROUP BY (posts.id) HAVING (count(messages.id) > ?)
WHERE posts.location IS NOT NULL

然后,您可以将其转换为 ActiveRecord 查询或仅使用find_by_sql. (我是凭记忆写的,因此您可能需要在某些地方对其进行调整……但总体思路应该可行)。

于 2012-07-30T09:05:41.360 回答
1

您可以在 Post 模型中使用此范围

范围:give_a_valid_name,lambda {|n| joins(:messages).having("COUNT(messages.id) = #{n}").where("location IS NOT NULL")}

然后使用 Post.give_a_valid_name(5).size 获取有 5 条消息的帖子数。

希望这可以帮助。

于 2012-07-30T10:02:55.243 回答
0

好的,多亏了 Tigraine 和 az7ar 的回答,我成功地度过了难关。这是解决的方法:

Post.joins(:messages).select('post_id as id').group("post_id").having("count(*) = 1").where('location IS NOT NULL')

感谢 Tigraine 的 JOIN 建议和 az7ar 的.where("location IS NOT NULL")语法。

于 2012-07-30T11:17:58.207 回答