使用Postgres和Activerecord在多列中查找具有重复值的记录的最佳方法是什么?
我在这里找到了这个解决方案:
User.find(:all, :group => [:first, :email], :having => "count(*) > 1" )
但这似乎不适用于postgres。我收到此错误:
PG :: GroupingError:错误:列“ parts.id”必须出现在GROUP BY子句中或在聚合函数中使用
使用Postgres和Activerecord在多列中查找具有重复值的记录的最佳方法是什么?
我在这里找到了这个解决方案:
User.find(:all, :group => [:first, :email], :having => "count(*) > 1" )
但这似乎不适用于postgres。我收到此错误:
PG :: GroupingError:错误:列“ parts.id”必须出现在GROUP BY子句中或在聚合函数中使用
Answers:
测试和工作版本
User.select(:first,:email).group(:first,:email).having("count(*) > 1")
而且,这有点无关,但是很方便。如果要查看每个组合的查找时间,请在末尾添加.size:
User.select(:first,:email).group(:first,:email).having("count(*) > 1").size
然后您将得到如下所示的结果集:
{[nil, nil]=>512,
["Joe", "test@test.com"]=>23,
["Jim", "email2@gmail.com"]=>36,
["John", "email3@gmail.com"]=>21}
以为那很酷,以前没看过。
感谢Taryn,这只是她的答案的调整版本。
select()
in:User.select([:first,:email]).group(:first,:email).having("count(*) > 1").count
.count
给出PG::UndefinedFunction: ERROR: function count
.size
代替.count
如果需要完整的模型,请尝试以下操作(基于@newUserNameHere的回答)。
User.where(email: User.select(:email).group(:email).having("count(*) > 1").select(:email))
这将返回行的电子邮件地址不唯一的行。
我不知道在多个属性上执行此操作的方法。
.select(:email)
也是多余的。我认为这会更清洁一点,但是我可能是错的。 User.where(email: User.select(:email).group(:email).having("count(*) > 1"))
select a.id, b.id, name, email FROM user a INNER JOIN user b USING (name, email) WHERE a.id > b.id
。不知道如何用ActiveRecord来表达这一点。