2011-02-06 3 views
1

은행에 지점 번호가 branches.bank_id 인 은행 및 지점을 카탈로그하려고한다고 가정합니다. 각 지점에는 awesomeness factor branches.awesomeness이 있습니다.GROUP BY에서 "가장 빠른"결과를 얻으려면 어떻게해야합니까?

최소한 멋진 분기별로 정렬 된 은행 목록을 반환하는 쿼리를 어떻게 구성합니까?

나는 다음과 같습니다

SELECT * FROM `banks` 
    INNER JOIN `branches` ON `branches`.`bank_id` = `banks`.`id` 
    GROUP BY `banks`.`id` 
    ORDER BY `branches`.`awesomeness` ASC; 

나는 이것을 할 때, 그 정보를 특정 은행으로 분류됩니다 결과에 이른를 보여주는 하나 인 (가장 멋진 지점 아니다 분기 GROUP BY 문 삭제).

어떻게해야합니까? 이 사람들을 던져 주시기 바랍니다 arel 스타일의 구문을 사용하거나 고려 레일 별 요구 사항을 고려하는 것이 더 편리합니다 그래서 만약

은 레일로 이동하기위한 것입니다.

+0

더 많은 스키마와 예상 결과가 표시되면 '가장 빠른'의미가 다소 손실됩니다. 시간/날짜? 또는 무엇을? – Jakub

답변

3

내가 왜 이해가 안 돼요 분기 데이터를 얻으려면 GROUP BY을 사용하십시오. 는 쿼리에서 GROUP BY을 제거하려면 정렬 업데이트 : 당신이 groupping에 insinst 경우 ORDER BY branches.bank_id, branches.awesomeness

는 각 그룹에 대한 최소한의 awesomeness를 얻기 위해 MIN() 집계 함수를 사용합니다.

ORDER BY MIN(branches.awesomeness) ASC;


업데이트 :

: 당신은 모두의 하이브리드를 원하고 awesomeness에 그 자체로 은행에서 "최소한의 awesomeness"에 의해 은행과 지점을 정렬 할 경우이 쿼리를 사용
SELECT b.*, r.*, brs.MinAw 
FROM banks b 
    INNER JOIN branches r ON r.bank_id = b.id 
    INNER JOIN (
     SELECT bank_id, MIN(awesomeness) MinAw 
     FROM branches 
     GROUP BY bank_id 
    ) brs ON b.id = brs.bank_id 
ORDER BY brs.MinAw, r.awesomeness; 
+0

고마워, Mr. The Scrum Meister. 집계 함수는 여전히 내 머리를 감싸기 위해오고 있습니다.귀하의 권장 사항은 잘 작동하는 것 같습니다. 나는 또한 귀하의 평가에 동의합니다. 나는 그 질문에 함축 한 것을 고려할 때 그룹화가 필요하지 않음을 전합니다. 이 질문에 대한 나의 진정한 목적은 그룹화가 유용하다는 것입니다 (즉, 질문자가 각 "은행"중 하나만을 기대합니다). 그리고 나는 그룹화를 필요로하는 복잡한 상황을 설명하기보다는 그룹을 찾고 있다고 주장하는 것이 더 도움이된다고 느꼈습니다. 그것. –

+1

@ steven-xu 그룹화를 사용하면 그룹을 정렬하는 것이 좋겠지 만 개별 그룹은 그룹 내에서 자체 분기되므로 ** 정렬 할 필요가 없습니다. MIN 함수를 사용합니다. '*'를 선택 했으므로 질의가 제대로 정렬되는 동안 반환 될 ** 분기 ** 행은 각 은행마다 임의로 지정됩니다 ('bank'로 그룹화했기 때문에). 그러나 'branch'를 선택하는 것). –

+0

중첩 된 쿼리 스타일을 사용하여 최소의 awesomeness를 생성하고 단순히 select 매개 변수 사이에'MIN (awesomeness) '를 포함시키는 것의 차이점은 무엇입니까? –

0

어쩌면? 스크럼 마이스터의 대답

select DISTINCT bank_id from branches 
ORDER BY awesomeness desc; 
1

보충 :

  • 구문은 아이에게 부모로부터 레코드를 조인 가입하고, 아이가있을 때 하나 개 이상의 레코드가 부모 레코드에 관련된 - 당신 ' 중복을 얻을 수 있습니다.

  • DISTINCT은 관련된 모든 테이블에서 모든 열을 선택하면 DISTINT를 제거하기 위해 전체 행을 복제해야하기 때문에 도움이되지 않습니다. 이 예제에서는 각 행에 대해 서로 다른 분기 정보가 있습니다.

  • MySQL의 GROUP BY 지원 열을 생략하면 대부분의 다른 데이터베이스에서이를 지원하므로 SQL Server, Oracle, PostgreSQL로 이동하면 작동하지 않습니다 ... MySQL의 GROUP BY 지원은 GROUP BY에 정의되지 않은 컬럼 값이며 집계 함수가 아닌 임의의 값일 수 있습니다. 데이터 세트가 클수록 일관되게 동일한 출력을 보장 할 가능성이 적습니다.

+0

PostgreSQL로 전환하려고 시도 중입니다. 세 번째 요점은 매우 정확합니다. 나는 여전히 psql을 사용하여이 기능을 스코프로 사용할 수 없습니다. –

+0

@Steven Xu : PostgreSQL 8.4 이상인 경우 ROW_NUMBER()를 사용하여 다시 작성하십시오 (슬프게도 MySQL이 지원하지 않는 분석 함수). –

+0

죄송합니다. ROW_NUMBER를 사용하는 힌트가 무엇을 의미하는지 자세히 설명해 주시겠습니까? 나는 문서를 훑어 보았고 현재의 질문에 관련이없는 것처럼 보입니다. –

관련 문제