回答

收藏

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

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

使用Postgres和Activerecord在多个列中查找具有重复值的记录的最佳方法是什么?
; r6 w! e" {. B我在这里找到了这个解决方案:/ ~- q1 R) P2 v
User.find(:all, :group => [:first, :email], :having => "count(*) > 1" )# R/ ?- i' {- i; j

; K2 D# x4 V3 O8 @3 V$ f$ t但这似乎不适用于postgres。我收到此错误:
+ T6 c, |: |: e7 q" H) L7 [PG :: GroupingError:错误:列“ parts.id”必须出现在GROUP BY子句中或在聚合函数中使用
1 J" j) B& D# `' {& H* o$ z               
3 d7 `+ B$ z4 f6 @3 H$ U1 w解决方案:
& |3 s  P3 M% Y% b               
; P+ f  X. t9 A3 r8 R2 }) X% r, z0 P7 J  H
0 F# e- B. U8 x2 X8 Z
                经过测试和工作的版本( e& k( }8 \1 j
User.select(:first,:email).group(:first,:email).having("count(*) > 1")
4 r7 J, M) v" R  `: l/ H
: S8 M7 ~+ V  e6 y另外,这有点无关,但是很方便。如果要查看每种组合的查找时间,请在末尾添加.size:0 M% q8 }. P4 _% T: ?2 M' E. ~
User.select(:first,:email).group(:first,:email).having("count(*) > 1").size
3 v7 f$ F9 ~- Z) i1 M1 T1 _: h% u+ j; V! i  r4 Y" f: U. T
您将获得如下所示的结果集:
7 j" O8 J: m# ~1 Y{[nil, nil]=>512,7 a& `9 z3 t4 d. z
["Joe", "test@test.com"]=>23,
2 C- g4 F0 F0 l( R/ J ["Jim", "email2@gmail.com"]=>36,) P% H5 p6 z, T5 x8 d3 \
["John", "email3@gmail.com"]=>21}$ j( D1 {3 @0 e- i1 o. I2 Q/ }+ Q# K

- Z" _- V/ b5 \) k4 a  K以为那很酷,以前没看过。4 K% Z9 o/ L. S7 ?6 `8 D8 T: F
感谢Taryn,这只是她的答案的调整版本。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则