2014-05-22 89 views
2

我是新來的postgresql。我有一個數據庫中有三個表:用戶,訂單,評論。這三個表看起來像這樣POSTGRESQL中的每個用戶獲得每個用戶的計數

 Orders    Comments 
     ------    -------- 
     ID     ID 
     UserID    UserID 
     Description   Details 
     CreatedOn    CreatedOn 

我試圖讓我的所有用戶,有多少訂單每個用戶取得了多少評論的每用戶作出的列表。換句話說,查詢的結果應該是這樣的:

UserID  Orders Comments 
------  ------ -------- 
1   5  7 
2   2  9 
3   0  0 
... 

目前,我嘗試以下:

SELECT 
    UserID, 
    (SELECT COUNT(ID) FROM Orders WHERE UserID=ID) AS Orders, 
    (SELECT COUNT(ID) FROM Comments WHERE UserID=ID) AS Comments 
FROM 
    Orders o, 
    Comments c 
WHERE 
    o.UserID = c.UserID 

這是做這種類型的查詢的正確方法嗎?還是有人可以從性能角度提供更好的方法?

+1

'GROUP BY'和'JOIN's。 –

+0

我剛剛更新了我的表格。在這種情況下,我不確定如何最好地使用GROUP BY。 – user3284007

回答

1

SQL Fiddle

select 
    id, name, 
    coalesce(orders, 0) as orders, 
    coalesce(comments, 0) as comments 
from 
    users u 
    left join 
    (
     select userid as id, count(*) as orders 
     from orders 
     group by userid 
    ) o using (id) 
    left join 
    (
     select userid as id, count(*) as comments 
     from comments 
     group by userid 
    ) c using (id) 
order by name 
0

通常的方法做,這是通過使用外部由id(和名稱)連接到其他兩個表,然後組

select u.id, 
     u.name, 
     count(distinct o.id) as num_orders, 
     count(distinct c.id) as num_comments 
from users u 
    left join orders o on o.userId = u.id 
    left join comments c on c.userId = u.id 
group by u.id, u.name 
order by u.name; 

這很可能是比你的方法快。但Postgres的查詢優化器非常聰明,我已經看到兩種解決方案在性能上基本相同的情況。

您需要對數據進行測試,並查看執行計劃以確定哪一個更有效。

+0

不起作用:http://sqlfiddle.com/#!15/c70dd/2 –

+0

@ClodoaldoNeto:謝謝。我在count()調用中忘記了'distinct':http://sqlfiddle.com/#!15/c70dd/3 –

相關問題