0

同じメール アドレスを持つ多くのユーザー オブジェクトがあることがわかりました。それらの重複を削除する必要があります。

User.select(:email).group(:email).having('COUNT(email) > 1')

次のクエリを試しました (これは、以前の質問 hereに似ています)。しかし、空の配列を取得します。理由はありますか?

2.0.0p247 :277 > User.select(:email).group(:email).having('COUNT(email) > 1')
  User Load (7801.4ms)  SELECT email FROM "users" GROUP BY email HAVING COUNT(email) > 1
  EXPLAIN (0.4ms)  EXPLAIN SELECT email FROM "users" GROUP BY email HAVING COUNT(email) > 1
EXPLAIN for: SELECT email FROM "users"  GROUP BY email HAVING COUNT(email) > 1
                                 QUERY PLAN
-----------------------------------------------------------------------------
 GroupAggregate  (cost=676876.34..739393.66 rows=3125866 width=22)
   Filter: (count(email) > 1)
   ->  Sort  (cost=676876.34..684691.01 rows=3125866 width=22)
         Sort Key: email
         ->  Seq Scan on users  (cost=0.00..147342.66 rows=3125866 width=22)
(5 rows)

 => [] 

更新また、Dave のソリューションを試してもうまくいきません。

2.0.0p247 :004 > User.select('email, count(email)').group('email').having('count(email) > 1')
  User Load (7858.0ms)  SELECT email, count(email) FROM "users" GROUP BY email HAVING count(email) > 1
  EXPLAIN (0.4ms)  EXPLAIN SELECT email, count(email) FROM "users" GROUP BY email HAVING count(email) > 1
EXPLAIN for: SELECT email, count(email) FROM "users"  GROUP BY email HAVING count(email) > 1
                                 QUERY PLAN
-----------------------------------------------------------------------------
 GroupAggregate  (cost=676876.34..747208.33 rows=3125866 width=22)
   Filter: (count(email) > 1)
   ->  Sort  (cost=676876.34..684691.01 rows=3125866 width=22)
         Sort Key: email
         ->  Seq Scan on users  (cost=0.00..147342.66 rows=3125866 width=22)
(5 rows)
4

2 に答える 2

2

あなたはこれを行うことができます:

duplicates = User.where(email: User.pluck(:email).detect{ |e| User.pluck(:email).count(e) > 1 })

ただし、これはメモリ内にあり、遅くなる可能性があります。おそらくアクティブなレコードでこれを行うより良い方法がありますが、簡単なグーグルでそれを見つけることができませんでした.

于 2013-07-15T20:52:08.827 に答える