计算孩子的关系和孩子的孩子数

时间:2012-11-14 01:15:44

标签: sql postgresql

对于naff标题感到抱歉,但我不确定如何解释这个问题,由于活跃的记录模式,我是SQL技能降级的新一代之一!

基本上我在PostgreSQL中有三个表

客户端(一个客户端有很多地图)     - id

地图(地图有一个客户端和多个图层)    - ID     - client_id

图层(图层有一个图)    - ID     - map_id

我想写一个返回Cliend.id的SQL查询,以及客户端有多少个地图的计数以及客户端在所有地图上的总层数。

单个查询是否可以实现?速度并不值得关注,因为这仅用于分析目的,所以不经常运行。

2 个答案:

答案 0 :(得分: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;

答案 1 :(得分: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

为了使其正常工作,您需要在模型之间声明的关联(Client has_many:maps,Map has_many:layers)

您可以在ActiveRecord的查询界面here

中进行删除