2016-11-16 71 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; 
相關問題