Postregres或ActiveRecord查询查找最多引用为外键的记录

时间:2015-07-23 18:57:06

标签: sql ruby-on-rails postgresql left-join aggregate-functions

我需要返回一个记录数组(来自表Foo),它们被引用为另一个数据库表的两列中的任何一列中的外键的次数:

 id  | old_foo_id | new_foo_id
-------------------------------
   1 |          1 |          1 
   2 |          2 |          2 
   3 |          3 |          3 
   4 |          1 |          1 
   5 |          1 |          2 
   6 |          2 |          4 
   7 |          4 |          2 
   8 |          5 |          5 
   9 |          6 |          6 
  10 |          7 |          7 

例如,使用上面的数据,我需要一个ActiveRecord(或直接SQL)查询来返回由大多数常见外键排序的哈希(如果同时出现在old_foo_id和{{new_foo_id中,则每个记录只计算一次1}})像这样:

{"2"=>4, "1"=>3, "4"=>2, "3"=>1,  "5"=>1, "6"=>1, "7"=>1}

除了遍历每个Foo对象并进行大量查询之外,我不知道如何做到这一点 - 看起来非常低效且耗时。 非常感谢提前!

我在这里发现了类似的问题: Get count of foreign key from multiple tables

2 个答案:

答案 0 :(得分:0)

对以前的回答感到抱歉:我会在app / models / foo.rb中创建一个对象:

为该模型创建一个可以返回这样一个哈希的方法:

def self.frequency_count
...

所以例如你想: {" 2" => 4," 1" => 3," 4" => 2," 3" => ; 1," 5" => 1," 6" => 1," 7" => 1}

所以我会这样做

foo has_many :bars

def self.counts
    self.bars.count
end

app/controllers/foo

def freq_counter
   @foos = Foo.all
   myHash = {}
   @foos.each do |foo|
      myHash[foo.id]= foo.counts
   end
   myHash
end

所以至少现在我们缩小了您希望在最优化的SQL命令中执行上述操作。

答案 1 :(得分:0)

经过大量的反复试验,这个SQL查询效果很好:

a = ActiveRecord::Base.connection.execute("SELECT foos.old_foo_id, count(*) FROM foos GROUP BY old_foo_id ORDER BY count DESC")
puts a.to_a