0

SQL 주위에서 머리를 감싸려고하고 있는데 PostgreSQL 9.3에서 다음 쿼리를 수행하는 방법을 알아내는 데 도움이 필요합니다. 다른 쿼리에서 반환 된 행 수를 ORDER BY로 쿼리 SELECT

은 내가 사용자 테이블을 가지고 있고, 사용자 ID 및 여러 행에 친구의 사용자 ID를 나열하는 친구 테이블.

사용자 테이블을 쿼리하고 ORDER BY 숫자를 명의 공통 친구가 사용자 ID와 공통으로 사용하고 싶습니다. 사용자 있도록 1은 4과 친구 등 5 및 친구 (10) 사용자 2에는, 그래서 내가 원하는, 그래서

user_id | friend_user_id 
1  | 4 
1  | 5 
2  | 10 
3  | 7 

그리고 :

그래서, 친구 테이블과 같을 것이다 선택에서 user_id의 결과에 대해 friend_user_id에서 사용자 1의 가장 높은 카운트로 정렬합니다.

+0

사용자가 원하는 정렬 된 출력의 종류와 테이블 스키마를 게시하십시오. –

답변

2

포스트그레스 방법은이 작업을 수행합니다 :

SELECT * 
FORM users u 
LEFT JOIN (
    SELECT user_id, count(*) AS friends 
    FROM friends 
    ) f USING (user_id) 
ORDER BY f.friends DESC NULLS LAST, user_id -- as tiebreaker 
  • 키워드 AS 테이블 별칭 바로 소음이다. 그러나 열 별칭에서 생략하지 마십시오. 나는 "Omitting the AS Key Word"에 설명서를 인용 :

    FROM에서 항목을 표준과 PostgreSQL 모두 AS는 예약되지 않은 키워드입니다 별칭 전에 를 생략 할 수 있습니다. 구문 상 모호하므로 때문에 출력 열 이름에 대해서는 이 적합하지 않습니다. 입니다.

    대담한 강조 광산.

  • ISNULL()은 MySQL 또는 SQL Server의 사용자 지정 확장입니다. Postgres는 SQL 표준 함수 COALESCE()을 사용합니다. 그러나 당신은 여기 필요하지 않습니다. 대신 더 빠르고 깨끗한 NULLS LAST clause을 사용하십시오.

  • 여러 명의 사용자가 동일한 수의 친구를 가질 것으로 예상됩니다. 이러한 동료는 임의로 정렬됩니다. 같은 함수를 두 번 호출하면 결과가 달라 지므로 일반적으로 바람직하지 않습니다. 표현식을 ORDER BY에 추가하십시오. 궁극적으로 기본 키는 나머지 모호성을 해결합니다.

  • 두 테이블이 같은 열 이름 user_id을 공유하는 경우 조인 절에 USING 구문 바로 가기를 사용할 수 있습니다. 또 다른 표준 SQL 기능. 매우 환영받는 부작용 : user_idON과 결합 할 때와 대조적으로 SELECT *의 출력에만 한 번만 나열됩니다. 많은 클라이언트는 출력에서 ​​중복 된 열 이름을 허용하지 않습니다.

+0

이것은 완벽했습니다, 감사합니다! –

0

이와 비슷한?

SELECT * FORM [users] u 
LEFT JOIN (SELECT user_id, COUNT(*) friends FROM fields) f 
ON u.user_id = f.user_id 
ORDER BY ISNULL(f.friends,0) DESC 
+0

PostgreSQL에 'ISNULL'이 없다는 것을 제외하고는 MySQL-ism입니다. 표준 SQL은'COALESCE'를 사용합니다. –

관련 문제