2016-11-16 148 views
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; 

我觉得这可能是工作(实施后的第()),但有做它一个更标准的方式?

+0

请提供的样本数据,你得到的结果和你预期的结果。 – Viki888

+0

你这样做的方式非常标准。您将列值按其他列聚合到数组中。 –

+0

@VaoTsun虽然他们在wiki上有一个[页面](https://wiki.postgresql.org/),但我还是很惊讶,本身并没有内置到Postgres中的FIRST()函数。 wiki/First/last_(aggregate)) – jhhayashi

回答

0

只是广告中的列到GROUP BY条款是这样的:

SELECT 
    u.id, 
    u.username, 
    u.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, u.username, u.email; 
相关问题