回答

收藏

使用Active Record,Rails和Postgres查找具有多个重复字段的行

技术问答 技术问答 129 人阅读 | 0 人回复 | 2023-09-13

使用Postgres和Activerecord在多个列中查找具有重复值的记录的最佳方法是什么?9 u# f& n% Y1 M( m
我在这里找到了这个解决方案:
7 S- E; N, ~, |8 t; w, m; k1 `3 bUser.find(:all, :group => [:first, :email], :having => "count(*) > 1" )
* y7 d" P& k! }' d# a+ x3 b) K& e. S0 N! q; e$ u- R+ O0 R. [
但这似乎不适用于postgres。我收到此错误:
2 @# `1 o: N4 }9 O" c% v) m: }PG :: GroupingError:错误:列“ parts.id”必须出现在GROUP BY子句中或在聚合函数中使用  {# i) T1 z7 ^; W- y6 z" J5 R
               
( y6 b4 N/ m/ o/ S: z) C- b* b解决方案:
, b9 o' K% U9 U               
- D$ A# y/ I+ g
2 b2 A7 ~  G  x& O$ Q5 }: T7 M1 @2 C0 n) t& [
                经过测试和工作的版本( E) n9 A$ Q# O+ P/ ^
User.select(:first,:email).group(:first,:email).having("count(*) > 1")
! ]+ v# K" c  ^8 J5 [
# ^& s$ [7 A2 c另外,这有点无关,但是很方便。如果要查看每种组合的查找时间,请在末尾添加.size:
0 e' |% `) z  p& W3 N' n/ J  u+ S% wUser.select(:first,:email).group(:first,:email).having("count(*) > 1").size
- A# _0 x# e4 z* J3 p& b' ^9 L! c) ]5 |7 r+ R
您将获得如下所示的结果集:8 x% A: l9 R# r, c) p
{[nil, nil]=>512,
2 Z2 L+ [( }: J( o. ^ ["Joe", "test@test.com"]=>23,
% ]' K+ S& `% _9 \& h& m ["Jim", "email2@gmail.com"]=>36,; O, l: }- a6 }: V: {
["John", "email3@gmail.com"]=>21}7 Y5 q2 m  z$ O0 Y# Y2 {: _. w

  b8 O. d& e7 d9 C9 Z" N以为那很酷,以前没看过。
3 Q& \, W8 K: A: Q8 L- u感谢Taryn,这只是她的答案的调整版本。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则