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).
4

1 回答 1

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出现的每一列。SELECTGROUP BY

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

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

于 2013-02-28T00:09:50.447 回答