2012-11-14 62 views
1

對不起,我不確定如何解釋這個,我是新一代的SQL技能已經退化的人之一感謝有效的記錄模式!得到一個孩子關係的計數和一個孩子的計數

基本上我有三個表中的PostgreSQL

客戶端(一個客戶機有許多地圖) - ID

地圖(地圖有一個客戶端和很多層) - ID - CLIENT_ID

層(層有一個地圖) - ID - map_id

我想編寫一個SQL查詢返回Cliend.id以及客戶端有多少地圖以及客戶端在所有地圖上的總層數。

這可能與一個單一的查詢?速度並不關心,因爲這僅僅是爲了分析目的,所以很少運行。

回答

2

我會爲此使用一對子查詢。喜歡的東西:

SELECT 
    id, 
    (
     SELECT count(map.id) 
     FROM map 
     WHERE map.client_id = client.id 
    ) AS n_maps, 
    (
     SELECT count(layer.id) 
     FROM map INNER JOIN layer ON (layer.map_id = map.id) 
     WHERE map.client_id = client.id 
    ) AS n_layers 
FROM client; 
+0

感謝克雷格,幾乎對我的作品,但n_laye rs似乎返回最後一張地圖中的圖層數量,而不是所有的地圖總和 – ChrisInCambo

+0

@ChrisInCambo奇怪的是,它不應該 - 除非我錯過了一些非常明顯的東西,當然這並不是前所未聞的。這是一個相當標準的相關子查詢。一些示例數據可能有助於('CREATE TABLE'和'INSERT's)在SQLFiddle上;我寧願不需要虛擬一個模型來進行測試。 –

+0

是的,我忘了地圖和圖層表之間有一個group_layer表。 – ChrisInCambo

1

我不喜歡這樣,一個SQL查詢的客戶端模型的方法中:

def self.statistics 
    Client.select(" 
      clients.id AS client_id, 
      COUNT(DISTINCT(maps.id)) AS total_maps, 
      COUNT(layers.id) AS total_layers") 
    .joins(maps: :layers) 
    .group("clients.id") 
end 

爲了這個工作,你需要之間聲明的協會你的模型(客戶的has_many:地圖,地圖的has_many:層)

你可以去depper中的ActiveRecord的查詢界面here

+0

在地圖ID上使用'DISTINCT'可能比我發佈的方法更好,但當然我會'解析ANALYZE'來查明。 +1 –