讓我們假設你的模型看起來像這樣:
class Category < ActiveRecord::Base
has_many :photos
end
class Photo < ActiveRecord::Base
belongs_to :category
end
我們還假設:
- 每張照片都有一個
qty_download
場,你在你的 問題 描述
- 每個類別有一個
name
字段
- 的目標是根據 訂購類別的顯示的所有
qty_download
的所有照片中每個 類別的總和
- 也沒關係完全排除沒有相關照片類別
有了這些假設,你應該能夠編寫
Category.
joins(:photos).
group("categories.id, categories.name").
select("categories.id, categories.name, sum(photos.qty_download) as total_downloads").
order("total_downloads desc")
需要注意的是什麼將返回將「相提並論tial「類別對象僅包含id
,name
和total_downloads
。如果您需要其他類別字段,請將它們添加到group
和select
子句中。
更新
較新的Postgres版本允許查詢的簡化:
Category.
joins(:photos).
group("categories.id").
select("categories.*, sum(photos.qty_download) as total_downloads").
order("total_downloads desc")
注意,在最新版本的Postgres,你可以簡單地通過一個唯一的ID羣 - 你不再必須按照您選擇的所有屬性來分組。所以你現在可以包含所有類別的屬性categories.*
。我會保留原來的版本(稍微)更高效,並向後兼容舊版Postgres。
而如果你想從類別中的所有領域,做到: 選擇(「類別*,SUM(照片。qty_download)AS times_downloaded「) 我認爲只需按」categories.id「進行分組就足夠了 – Humza 2014-12-03 09:05:17
至少對於Postgres來說,當您使用group時,'select'子句中的所有內容都必須出現在'group by'子句中或者是一個聚合函數,所以你的建議都不會起作用YMMV與其他數據庫 – 2014-12-03 09:11:10
你是正面的嗎?因爲我在mysql上運行了原始文件,但是現在我在使用postgres的rails項目中,導軌控制檯: 'Model1.limit(1).joins(:model2s).group(「#{Model1.table_name} .id」)。select(「#{Model1.table_name}。*,SUM(# Model2.table_name} .id)AS mgids「) – Humza 2014-12-03 09:41:02