次のクエリで
SELECT
users.id,
users.username,
users.email,
groups.permission
FROM users
INNER JOIN memberships ON users.id = memberships.user_id
INNER JOIN groups ON memberships.group_id = groups.id
INNER JOIN groupings ON groups.id = groupings.group_id
WHERE groupings.repo_id = 1
GROUP BY users.id, groups.permission
ORDER BY users.id
次の行が表示されます。
----+---------------------------+-----------------------------------------+------------
id | username | email | permission
----+---------------------------+-----------------------------------------+------------
2 | viva_leuschke0 | viva_leuschke0@ritchiealtenwerth.org | 1
2 | viva_leuschke0 | viva_leuschke0@ritchiealtenwerth.org | 2
3 | loyce_herman1 | herman1.loyce@bednar.com | 1
3 | loyce_herman1 | herman1.loyce@bednar.com | 3
4 | verona_vandervort2 | verona.vandervort2@mante.biz | 1
4 | verona_vandervort2 | verona.vandervort2@mante.biz | 2
4 | verona_vandervort2 | verona.vandervort2@mante.biz | 3
5 | bruen3_ms_hans | ms.bruen3.hans@bechtelar.net | 1
5 | bruen3_ms_hans | ms.bruen3.hans@bechtelar.net | 2
5 | bruen3_ms_hans | ms.bruen3.hans@bechtelar.net | 3
----+---------------------------+-----------------------------------------+------------
問題は、このクエリを微調整して一意の行を返し、最高のアクセス許可値でフィルタリングするにはどうすればよいですか?何かのようなもの:
----+---------------------------+-----------------------------------------+------------
id | username | email | permission
----+---------------------------+-----------------------------------------+------------
2 | viva_leuschke0 | viva_leuschke0@ritchiealtenwerth.org | 2
3 | loyce_herman1 | herman1.loyce@bednar.com | 3
4 | verona_vandervort2 | verona.vandervort2@mante.biz | 3
5 | bruen3_ms_hans | ms.bruen3.hans@bechtelar.net | 3
----+---------------------------+-----------------------------------------+------------
PostgreSQL9.1を使用しています。
更新:句を使用するDISTINCT ON
ことで、私は欲しいものを手に入れることができました。
SELECT DISTINCT ON(users.id)
users.id,
users.username,
users.email,
groups.permission
FROM users
INNER JOIN memberships ON users.id = memberships.user_id
INNER JOIN groups ON memberships.group_id = groups.id
INNER JOIN groupings ON groups.id = groupings.group_id
WHERE groupings.repo_id = 1
GROUP BY users.id, groups.permission
ORDER BY
users.id ASC,
groups.permission DESC
これが最善の方法ですか?