【发布时间】:2011-06-12 22:25:50
【问题描述】:
我正在尝试在 PostgreSQL 中编写一个查询,但我有点沮丧,因为它适用于其他数据库引擎。我需要从给定的联接表中选择前 5 个用户,如下所示:
选择用户。*, COUNT(deals.id) AS num_deals 来自用户,交易 WHERE deal.users_id = users.id GROUP BY users.id 按 num_deals 限制 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 中做到这一点?
【问题讨论】:
-
我相信它在 MySQL 和 SQLite 中有效,但“etc”是错误的。没有其他数据库允许这样做。只有这两个。
-
其实,假设 users.id 是 PRIMARY KEY,它没有错。 (尽管例如 MySQL 在正确和错误时都会这样做)。 PostgreSQL 9.1 将支持以编写方式运行此查询 - 因为 GROUP BY 在 PRIMARY KEY 上,我们可以推断所有其他列在功能上都依赖于它。
-
@Magnus:我知道9.1会支持这个,但是9.1目前不可用
-
@horse:绝对正确。但他们错误的说法部分(尽管只是部分)不正确。
-
@MagnusHagander:你知道为什么需要 PRIMARY KEY 而不仅仅是 UNIQUE 吗?我无法想象唯一性不够好的情况。
标签: database postgresql aggregate-functions