0

私はPostgresql9.2でクエリを開発するように依頼されましたが、これは限られた露出しかありませんが、ユーザー情報(usersテーブルから)とその役割(roleテーブルから-ユーザーは多くの役割を持っている可能性があります)を1つに返します行。私が持っているのは:

[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 に答える