1
我有两个表:user
跟踪用户信息和users_classes
跟踪用户和类之间的关系(类在一个单独的表)。我想加入这些表并返回用户的信息以及它们所在的类的数组。有没有一种有效的方法可以这样做?使用Postgres聚合函数在每个GROUP BY组中选择第一行?
表结构:
CREATE TABLE users (
id BIGSERIAL PRIMARY KEY,
username VARCHAR(255) UNIQUE,
email VARCHAR(255) NOT NULL UNIQUE
)
CREATE TABLE users_classes (
user_id BIGINT REFERENCES users(id),
class_id BIGINT REFERENCES classes(id),
PRIMARY KEY(user_id, class_id)
)
我尝试:
SELECT
u.id,
FIRST(u.username) AS username,
FIRST(u.email) AS email,
array_agg(c.class_id) AS classes
FROM users_classes AS c
JOIN users AS u
ON c.user_id = u.id
GROUP BY u.id;
我觉得这可能是工作(实施后的第()),但有做它一个更标准的方式?
请提供的样本数据,你得到的结果和你预期的结果。 – Viki888
你这样做的方式非常标准。您将列值按其他列聚合到数组中。 –
@VaoTsun虽然他们在wiki上有一个[页面](https://wiki.postgresql.org/),但我还是很惊讶,本身并没有内置到Postgres中的FIRST()函数。 wiki/First/last_(aggregate)) – jhhayashi