2012-12-16 4 views
2

로 가장 높은 값을받을제거 행 중복 및 다음 쿼리와 PostgreSQL을

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   | [email protected] | 1 
    2 | viva_leuschke0   | [email protected] | 2 
    3 | loyce_herman1    | [email protected]    | 1 
    3 | loyce_herman1    | [email protected]    | 3 
    4 | verona_vandervort2  | [email protected]   | 1 
    4 | verona_vandervort2  | [email protected]   | 2 
    4 | verona_vandervort2  | [email protected]   | 3 
    5 | bruen3_ms_hans   | [email protected]   | 1 
    5 | bruen3_ms_hans   | [email protected]   | 2 
    5 | bruen3_ms_hans   | [email protected]telar.net   | 3 
----+---------------------------+-----------------------------------------+------------ 

질문은 : 나는 독특한 반환이 쿼리를 조정할 수있는 방법을 가장 높은 권한 값으로 필터링하는 행 예 :

----+---------------------------+-----------------------------------------+------------ 
id |   username   |     email     | permission 
----+---------------------------+-----------------------------------------+------------ 
    2 | viva_leuschke0   | [email protected] | 2 
    3 | loyce_herman1    | [email protected]    | 3 
    4 | verona_vandervort2  | [email protected]   | 3 
    5 | bruen3_ms_hans   | [email protected]   | 3 
----+---------------------------+-----------------------------------------+------------ 

저는 PostgreSQL 9.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 

이것이 최선의 방법인가요? 더 정밀한 점검에

+0

난 당신이 게시 가정 (유효를!) 당신이 응답 * *으로 발견 대답과 이용 약관을 읽고 동의. 그것은 권장되는 방법입니다. 자신의 질문에 대답 할 수 있습니다. –

+0

Hehehehehe ... 실제로 쿼리가 작업에 가장 적합한 것인지 묻고있었습니다. –

+0

두 가지를 놓친 것처럼 보입니다. 추가 된 질문과 추가 된 쿼리의 불완전 성. 니스, 깨끗한 질문, btw. –

답변

1

는 쿼리은 (그리고해야한다)을 개선 할 수 있습니다


SELECT DISTINCT ON (u.id) 
     ,u.id 
     ,u.username 
     ,u.email 
     ,g.permission 
FROM users  u 
JOIN memberships m ON m.user_id = u.id 
JOIN groups  g ON g.id = m.group_id 
JOIN groupings gi ON gi.group_id = g.id 
WHERE gi.repo_id = 1 

             
  
    GROUP BY u.id, g.permission 
   
ORDER BY u.id, g.permission DESC 

GROUP BY은 아무 소용이입니다. DISTINCT ON 만 있으면 users.id이 유일합니다. GROUP BY을 제거하면 똑같은 결과를 얻을 수 있습니다.

ORDER BY에 열을 더 추가하여 id이 둘 이상인 경우 permission이 둘 이상인 곳을 선택할 행을 결정할 수 있습니다. 당신이 가지고있는 방식대로, 당신은이 사건에 대한 임의의 선택을하게됩니다.

My reference answer for this query technique has more explanation, a benchmark and links.

+0

안녕하세요! 링크를 가져 주셔서 감사합니다. 또한 적절한 색인을 추가하는 방법에 대한 정보도 포함됩니다. <3 <3 <3 –