4

同じユーザー名を持つすべてのユーザーを 3M テーブルで検索しようとしました。このようなものがうまくいくかもしれません。

User.find(:all, :group => [:username], :having => "count(*) > 1" )

ただし、Postgres を使用しているため、これは me を返しますActiveRecord::StatementInvalid: PG::Error: ERROR: column "users.id" must appear in the GROUP BY clause or be used in an aggregate function

私はこのようなことを試みています

User.select('users.id, users.username').having("count(*) > 1").group('users.username')

しかし、それでも同じエラーが発生します。私が間違っていることは何か分かりますか?

更新:を使用して何とか動作させましたUser.select('users.*').group('users.id').having('count(users.username) > 1')が、このクエリは、5 つのレコードを作成している場合でも、空の配列のように見える this を返します。

 GroupAggregate  (cost=9781143.40..9843673.60 rows=3126510 width=1365)
   Filter: (count(username) > 1)
   ->  Sort  (cost=9781143.40..9788959.68 rows=3126510 width=1365)
         Sort Key: id
         ->  Seq Scan on users  (cost=0.00..146751.10 rows=3126510 width=1365)
(5 rows)

 => [] 

なぜこれが起こっているのか、これらの5行を取得する方法はありますか?

4

2 に答える 2

0

データベースの "group by" は、出力で各グループを 1 行にまとめます。ほとんどの場合、意図したものは次のクエリによって生成されます。

    User.where("name in (select name from users group by name having count(*)>1)").order(:name)

上記の内部クエリは、複数回出現するすべての名前を検索します。次に、これらの名前を持つすべての行を見つけます。名前で注文すると、その後の処理が簡単になります。高速化するには、users テーブルの列名にインデックスを追加します。

これを解決する別の Postgres 固有の方法がありますが、上記はすべてのデータベースで機能します。

于 2013-07-14T19:14:16.330 に答える