web-dev-qa-db-ja.com

ActiveRecordを使用したGROUP BYおよびCOUNT

これを参照: GROUP BYとDISTINCTに違いはありますか

Given a table that looks like this:

name
------
barry
dave
bill
dave
dave
barry
john
This query:

SELECT name, count(*) AS count FROM table GROUP BY name;
Will produce output like this:

name    count
-------------
barry   2
dave    3
bill    1
john    1

ActiveModelがCOUNTでGROUP BYを実行するための正しいRails規約とは何ですか?

25
Axil

DistinctおよびGroup Byは、異なる結果を提供します。期待する結果を得るには、使用したいと思うでしょう

Person.all.group(:name).count
(1.2ms)  SELECT COUNT(*) AS count_all, name AS name FROM "people" GROUP BY "people"."name"
=> {"Dan"=>3, "Dave"=>2, "Vic"=>1} 

上記のように、グループはハッシュとして物事を返します。 distinctは、以下に示すように、合計で人数を返します。

Person.all.distinct(:name).count
(0.4ms)  SELECT DISTINCT COUNT(DISTINCT "people"."id") FROM "people"
=> 6 
54
thedanotto

受け入れられた答えはハッシュを返すことに注意してください:

Tagging.joins(:tag).group(:name).size
   (0.4ms)  SELECT COUNT(*) AS count_all, `name` AS name FROM `taggings` INNER JOIN `tags` ON `tags`.`id` = `taggings`.`tag_id` GROUP BY `name`
 => {"applesauce"=>1, "oranges"=>2} 

しかし、結合の異なるテーブルからカウントといくつかの列を返したい場合はどうでしょう。次に、select ActiveRecordクエリも使用する必要があります。

collection = Tagging.select('COUNT(*) as total, taggings.taggable_id, taggings.taggable_type').joins(:tag).where(taggable_type: 'LineItem', taggable_id: ['5cad0dcc3ed1496086000031', '5cad0dcd3ed1496086000081'] ).group(:name)

collection.each do |item|
  puts item.taggable_id
  puts item.total
end

5cad0dcc3ed1496086000031
1
5cad0dcc3ed1496086000031
2

この2番目のアプローチを使用すると、クエリやループ構造を追加せずに、結合関係に関する追加の詳細を取得できます。

1
Donato