1

くだらないタイトルで申し訳ありませんが、これをどのように説明すればよいかよくわかりません。私は、アクティブ レコード パターンのおかげで SQL スキルが低下した新世代の 1 人です。

基本的に、PostgreSQLに3つのテーブルがあります

クライアント (1 つのクライアントに多くのマップがあります) - id

マップ (マップには 1 つのクライアントと多数のレイヤーがあります) - id - client_id

レイヤー (レイヤーには 1 つのマップがあります) - id - map_id

Cliend.id を返す SQL クエリを、クライアントが持っているマップの数と、クライアントがすべてのマップで持っているレイヤーの総数と共に書きたいと思います。

これは単一のクエリで可能ですか? これは分析目的のためだけに実行されるため、速度は問題ではありません。

4

2 に答える 2

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;
于 2012-11-14T01:25:04.283 に答える
1

Client モデルのメソッド内の単一の 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 のクエリ インターフェイスを使用できます。

于 2012-11-14T01:38:09.497 に答える