2012-11-14 4 views
1

불편을 끼쳐 드려 죄송 합니다만 설명 할 수있는 방법이 확실하지 않지만 SQL 기술이 저하 된 새로운 세대 중 하나입니다 적극적인 레코드 패턴 덕분에! ID자식 관계 수 및 자식 자식 수 얻기

지도 (지도 하나의 클라이언트 많은 레이어가) - - ID - CLIENT_ID

는 기본적으로 나는

클라이언트 (하나의 클라이언트가 많은지도를 가지고) PostgreSQL의 세 테이블이 레이어 (레이어에는 하나의지도가 있음) - 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

감사 크레이그에 depper 갈 수

, 즉 거의 나를 위해 작동하지만 n_laye rs는 마지막지도에서 레이어 수를 반환하는 것처럼 보입니다. – ChrisInCambo

+0

@ChrisInCambo 이상하게 들리 겠지만, 내가 듣지 못한 것이 아니라는 것을 분명히 알지 못한다면 말입니다. 꽤 표준 상관 관계가있는 서브 쿼리입니다. 일부 샘플 데이터는 SQLFiddle에서 도움이 될 것입니다 (CREATE TABLE 및 INSERT). 차라리 테스트를 위해 모델을 다듬을 필요가 없습니다. –

+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 : 층) 당신은 액티브의 쿼리 인터페이스 here

+0

지도 ID에'DISTINCT'를 사용하면 내가 게시 한 것보다 더 나은 접근법 일 것입니다. 물론'EXPLAIN ANALYZE'를 찾아 낼 수도 있습니다. +1 –