2013-02-27 59 views
0

我已经要求开发PostgreSQL的9.2,我只有有限的接触到一个查询,将返回(从users表)一个用户的信息一起他们的角色(来自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; 

我需要得到的是:

users.firstname, users.lastname, users.username, users....(other user info), 
role.name, role.name (one role name for each role a user has). 
+0

请加*真正*的定义。我不读速记符号。 – wildplasser 2013-02-28 00:10:09

回答

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列是完全不必要的,或许应该PRIMARY KEY(user_id, role_id)除非你正在处理的愚蠢被替换无法应付复合主键的ORM。

+0

你的工作很棒 - 确实将array_agg改为string_agg。另外感谢您对user_role.id的评论 - 这不是我的数据库,但我会采取评论给用户。 – RWBear 2013-02-28 20:12:26

相关问题