2010-09-05 42 views
2
集團

我有這樣一個表:軌,計數和

+--------+-----------+-------+-----------+ 
|house_no|house_alpha|flat_no|street_name| 
+--------+-----------+-------+-----------+ 
|  1|   |  |James St | 
|  1|   |  |James St | 
|  1|   |  |James St | 
|  2|   A|  |James St | 
|  2|   B|  |James St | 
|  3|   A|  |James St | 
|  4|   | 416|James St | 
|  4|   | 416|James St | 
+--------+-----------+-------+-----------+ 

而且我想算在此表中不同地址的數量。 這將返回不同的地址:

Address.all(:select => 'street_name, flat_no, house_no, house_alpha', 
      :group => 'street_name, flat_no, house_no, house_alpha').length 

但我想這樣做的SQL結束。並試圖結合計數和小組不喜歡我。我顯然做錯了什麼。

(數據庫是postgres,rails是2.x)。

+0

你的意思是'Address.count(:組=> '慨,flat_no,house_no,house_alpha':獨特=>真)'不起作用? – 2010-09-06 00:59:06

+0

沒有。它沒有。 – robotdana 2010-09-06 01:41:37

回答

2

我不確定是否有漂亮的Rails方法來對整個分組列進行計數。在SQL中有很多奇怪的方法可以做到這一點,但這種方式很容易遵循。

Address.find(:all, 
      :select => "count(*) as addr_count", 
      :having => "addr_count > 0", 
      :group => 'street_name, flat_no, house_no, house_alpha').size 

這將運行以下SQL查詢。

SELECT count(*) as addr_count FROM "addresses" GROUP BY street_name, flat_no, house_no, house_alpha HAVING addr_count > 0 

編輯:閱讀本Postgres的

從下面的評論,在這裏是做對的Postgres上述的方式。

Address.find(:all, 
      :select => "count(*)", 
      :having => "count(*) > 0", 
      :group => 'street_name, flat_no, house_no, house_alpha').size 

這會生成以下查詢。

SELECT count(*) FROM "addresses" GROUP BY street_name, flat_no, house_no, house_alpha HAVING count(*) > 0 
+0

是addr_count一件神奇的事情?或者我需要爲此添加一列?你寫的東西不起作用。 – robotdana 2010-09-06 01:39:26

+0

addr_count只是一個SQL別名,沒有什麼不可思議的。它不代表專欄。請發佈您的控制檯輸出和日誌,以解釋「不起作用」的含義。 – jdl 2010-09-06 02:44:01

+0

另外,你的表有一個ID列? – jdl 2010-09-06 02:44:50

5

對於阿雷爾軌道3,你可以做到以下幾點:

Address.group(:street_name, :flat_no, :house_no, :house_alpha).having("count(*) > 0").count.size 
1

梁2,我已經找到了:group選擇不表現可靠(在我的最新情況,這讓每個組中只有第一條記錄的數組)。作爲替代方案,你可能你的數據庫搜索與EnumerableArray#group_by如下組合:

addresses = Address.find(:all, 
      :select => "count(*) as addr_count", 
      :having => "addr_count > 0"), 
grouped_addrs = addresses.group_by{|a| [a.street_name, a.flat_no, a.house_no, a.house_alpha] }