29

使用 ruby​​ 和新的 Activerecord 在列中查找具有重复值的记录的最佳方法是什么?

4

6 回答 6

51

将@TuteC 翻译成 ActiveRecord:

sql = 'SELECT id, 
         COUNT(id) as quantity 
         FROM types 
         GROUP BY name 
       HAVING quantity > 1'
#=>
Type.select("id, count(id) as quantity")
  .group(:name)
  .having("quantity > 1")
于 2011-02-24T18:10:14.317 回答
27

以下是我使用 AREL 助手解决它的方法,没有自定义 SQL:

Person.select("COUNT(last_name) as total, last_name")
  .group(:last_name)
  .having("COUNT(last_name) > 1")
  .order(:last_name)
  .map{|p| {p.last_name => p.total} }

实际上,这只是编写 SQL 的一种更好的方式。这会找到所有具有重复 last_name 值的记录,并告诉您有多少和哪些姓氏在一个不错的哈希中。

于 2012-07-12T05:20:15.140 回答
17

我用 2016 堆栈(Rails 4.2,Ruby 2.2)解决了这个问题,并得到了我想要的:

> Model.select([:thing]).group(:thing).having("count(thing) > 1").all.size
 => {"name1"=>5, "name2"=>4, "name3"=>3, "name4"=>2, "name5"=>2}
于 2016-08-11T08:36:17.740 回答
11

使用自定义 SQL,这会找到types相同的值name

sql = 'SELECT id, COUNT(id) as quantity FROM types
         GROUP BY name HAVING quantity > 1'
repeated = ActiveRecord::Base.connection.execute(sql)
于 2011-02-24T14:58:51.407 回答
5

在 Rails 2.x 中,select 是 AR 类的私有方法。只需使用 find():

klass.find(:all, 
  :select => "id, count(the_col) as num", 
  :conditions => ["extra conditions here"], 
  :group => 'the_col', 
  :having => "num > 1")
于 2011-04-04T17:48:23.570 回答
1

这是一个扩展其他答案的解决方案,以显示如何查找和遍历按重复字段分组的记录:

duplicate_values = Model.group(:field).having(Model.arel_table[:field].count.gt(1)).count.keys
Model.where(field: duplicate_values).group_by(&:field).each do |value, records|
  puts "The records with ids #{records.map(&:id).to_sentence} have field set to #{value}"
end

这似乎很遗憾必须通过两个查询来完成,但这个答案证实了这种方法。

于 2018-07-10T20:23:30.117 回答