2011-01-21 114 views
3

我試圖在PostgreSQL中編寫查詢,並且因爲它適用於其他數據庫引擎而感到有點沮喪。我需要從一個給定的連接的表像這樣選擇前5名用戶:postgreSQL選擇未在聚合函數中使用的其他列

 
SELECT users.*, 
     COUNT(deals.id) AS num_deals 
FROM users, deals 
WHERE deals.users_id = users.id 
GROUP BY users.id 
ORDER BY num_deals LIMIT 5; 

我所需要的前5名用戶。這段代碼可以在sqlite,mysql等工作,但PostgreSQL拒絕選擇其他字段在集合函數中不使用。我收到以下錯誤:

PGError: ERROR: column "users.id" must appear in the GROUP BY clause or be used in an aggregate function 

如何在PostgreSQL中執行此操作?

+2

我相信它工作在MySQL和SQLite但「等」是錯的。沒有其他數據庫允許這個。這是唯一的兩個。 – 2011-01-21 08:02:26

+1

其實,假設users.id是一個主鍵,它是*不*錯。 (儘管MySQL在正確和錯誤的時候都會這樣做)。 PostgreSQL 9.1將支持按照其編寫的方式運行此查詢 - 因爲GROUP BY位於PRIMARY KEY上,所以我們可以推斷出所有其他列在功能上依賴於它。 – 2011-01-21 09:58:15

+0

@Magnus:我知道9.1會支持這個,但9.1目前還不可用 – 2011-01-21 14:26:39

回答

7

你可以嘗試:

SELECT users.*, a.num_deals FROM users, (
    SELECT deal.id as dealid, COUNT(deals.id) AS num_deals 
    FROM deals 
    GROUP BY deal.id 
) a where users.id = a.dealid 
ORDER BY a.num_deals DESC 
LIMIT 5 
2

假設users.id是PK,那麼你可以

等待9.1

組由各個領域的

使用聚合(即max())所有字段

1

另一個解決方案,工作我s到暗中使用的所有屬性在GROUP BY

因此下面將是最終的查詢

SELECT users.*, 
     COUNT(deals.id) AS num_deals 
FROM users, deals 
WHERE deals.users_id = users.id 
GROUP BY users.id, users.name, users.attrib1, ..., users.attribN 
ORDER BY num_deals LIMIT 5; 

如果您使用的是像Rails框架,那麼你可以很容易地這與Model.column_names功能實現。

0

只是在有人的情況下,希望ANSI-92標準的解決方案,不喜歡「甲骨文」的方式來連接表...

SELECT users.*, num_deals 
FROM users 
JOIN 
    (SELECT deals.users_id as users_id, count(deals.users_id) as num_deals 
    FROM deals 
    GROUP BY deals.id) grouped_user_deals 
ON grouped_user_deals.users_id = users.id 
ORDER BY num_deals DESC 
LIMIT 5; 
相關問題