2012-07-27 28 views
1

我有4個表: 域: :有很多=>頻道 :的has_many =>銷售 :的has_many =>訪問查詢與nexted聯接採取了很長一段時間

我試圖讓所有我的域,頻道數,銷售數和訪問人數在此查詢每個域:

SELECT 
    kd.id, kd.domain, 
    COUNT(distinct kc.id) AS channels_count, 
    COUNT(distinct kv.id) AS visits_count, 
    COUNT(distinct kv.ip_address) AS visitors_count, 
    COUNT(distinct ks.id) AS sales_count 
FROM 
    domains AS kd 
LEFT JOIN 
    channels AS kc 
    ON(kc.domain_id=kd.id) 
LEFT JOIN 
    sales AS ks 
    ON(ks.channel_id=kc.id) 
LEFT JOIN 
    visits AS kv 
    ON(kv.channel_id=kc.id) 
GROUP BY kd.id 

我有銷售拜訪表,沒有什麼大幾千元的記錄,但我的查詢需要永遠。它永遠不會回來。任何想法爲什麼?

db:postgresql

+1

用於記錄的金額,你需要實現索引。 http://www.postgresql.org/docs/7.4/static/indexes.html – levi 2012-07-27 01:02:09

+1

您是否在相關表「kc.domain_id,kv.channel_id,kv.channel_id'上定義了外鍵,然後是索引? – 2012-07-27 01:03:00

+0

是的,我在所有連接點上都有索引。一個解釋顯示了過多的記錄被拉,所以我想這是錯誤的事實,我必須加入我的頻道表與2多個表,但我似乎無法找到任何錯誤。 – 2012-07-27 01:04:39

回答

2

COUNT(DISTINCT)可以是資源管理器。另外,您的表可能在「kd.id」列中有許多重複項,導致產生大量的行。

更有效的方法是首先進行聚合,然後將結果結合在一起。我想下面的查詢你想要做(我假定ID列在每個表中是唯一的)什麼:

SELECT kd.id, kd.domain, channels_count, visits_count, 
     visitors_count, sales_count 
FROM domains kd LEFT JOIN 
    (select kc.domain_id, count(*) as channels_count 
     from channels kc 
     group by kc.domain_id 
    ) kc 
    ON(kc.domain_id=kd.id) LEFT JOIN 
    (select ks.channel_id, count(*) as sales_count 
     from sales ks 
     group by ks.channel_id 
    ) ks 
    ON(ks.channel_id=kc.id) LEFT JOIN 
    (select kv.channel_id, count(*) as visits_count, 
      count(distinct ipaddress) as visitors_count 
     from visits kv 
     on kv.channel_id 
    ) 
    ON(kv.channel_id=kc.id) 

GROUP BY kd.id

+0

我會給這個鏡頭謝謝 – 2012-07-27 01:11:59

+0

我希望它可以更乾淨,但它是完美的在結果方面。謝謝。 – 2012-07-27 01:32:33