查询以在单行中获取用户信息和角色列表

时间:2013-02-27 23:54:40

标签: sql postgresql

我被要求在Postgresql 9.2上开发一个查询,我只有有限的曝光,它将返回用户信息(来自users表)及其角色(来自{{1}表格 - 用户可能有很多角色)在一行中。我所拥有的是:

role

我需要得到的是:

[user table] --> [user_role table] <-- [role table]
users table: id, firstname, lastname, username, ... ; 
user_role table: id, user_id (fk to user); 
role_id (fk to role); role table: id, name;

1 个答案:

答案 0 :(得分:2)

像这样的东西,我希望:

SELECT u.id, u.firstname, u.lastname, array_agg(r.name)
FROM user u 
LEFT OUTER JOIN user_role ur ON (u.id = ur.user_id)
LEFT OUTER JOIN role r ON (ur.role_id = r.id)
GROUP BY u.id;

根据所需的输出格式,您可能需要string_agg而不是array_agg

由于您未提供样本数据,因此未经测试。如果您使用的是旧的PostgreSQL版本,则需要明确指定user列表中SELECT列表中显示的GROUP BY的每一列。

请注意,角色将在单个列中返回。那是必要的;不支持动态宽度表,其中不同的行可以具有不同的宽度。您可以使用几乎任何您喜欢的格式 - 分隔文本,xml,json,hstore,数组等。

您的user_role.id列完全没有必要,除非您正在处理无法处理复合主键的愚蠢ORM,否则应该替换为PRIMARY KEY(user_id, role_id)