2009-12-16 2 views
1

50 개의 열과 1000 개의 행이있는 테이블이 있습니다. 각 열에 대해 상위 5 개 레코드를 출력하고 싶습니다.MySql에서 각 열의 상위 N 값을 얻는 방법

SELECT MAX(column1), MAX(column2), MAX(column3) FROM table 

이 각 열에 대해 최고 값을 가져옵니다하지만 어떻게 내가 N 회 두 번째 "최대"값을 얻을 수 있습니다 : 1 개 기록을 얻으려면 내가합니까? 별도로 두 번째 열을 끌어해야합니다, 그래서

답변

3

이것은 하나의 쿼리에서 수행하려는 작업이 아닙니다. 그냥 각 열에 대해 하나의 쿼리를 분해하십시오. 올바른 상황 (일명 올바른 인덱스와 오른쪽 컬럼 유형)에서, MySQL은 실제로 단락으로 이러한 쿼리를 최적화 할 수 있으므로 전체 테이블을 스캔 할 필요가 없으며 상위 5 개 값을 추출하고 완료합니다.

SELECT column1 FROM table ORDER BY column1 DESC LIMIT 5 
SELECT column2 FROM table ORDER BY column2 DESC LIMIT 5 
etc 

당신은 하나의 거대한에 함께 그들 모두를 smoosh하려고하면 미봉책 쿼리는 단지 포기 최적화를 설득하고, 전체 테이블 50 회 다시 검사 한 후 50 개 임시 테이블과 아마를 사용하여 관리 할 수 ​​있습니다 좋은 측정을위한 파일 정렬. 따라서 테이블에 약 10 개의 행이 없으면 (분명히 그렇지 않음) 50 개의 개별 쿼리가 항상 더 빠릅니다.

-1
SELECT MAX(column1), MAX(column2), MAX(column3) FROM table LIMIT n 

어디

그러나 배의 N = 수, 당신은 단지 전체 쿼리에 대한 LIMIT를 사용할 수 있습니다.

0

더 좋은 방법이 있지만 SELECT 문을 중첩 할 수 있습니다. 같은

뭔가 : Oracle을 사용하는 경우 "이중 FROM"

SELECT (SELECT column1 FROM table ORDER BY column1 LIMIT 5) a, 
     (SELECT column2 FROM table ORDER BY column2 LIMIT 5) b, 
     (SELECT column3 FROM table ORDER BY column3 LIMIT 5) c 

추가.

+0

이것은 해결책이지만, 50 개 이상의 중첩 된 선택 쿼리를 피하기 위해 더 짧은 방법을 쓰고 있습니다. 계산하기가 무거울까요? –

+0

-1 하위 쿼리는 둘 이상의 행을 반환 할 수 없습니다. – Andomar

+0

@Andomar 예 가능합니다. 방금 시험 했어. 그러나 당신은 그들에게 별명을 붙여야한다. 나는이 포스트에서 놓친다. 지금 고쳤다. – Verhogen

0

각 열의 최대 값 5 개가 고유 한 행에서 발생할 수 있다고 가정 할 때 50 개의 쿼리에서이 작업을 수행해야합니다.

설명 : SQL 쿼리 의 선택 목록에있는 표현식은이 같은 행을 참조해야합니다. 그래서 당신은 column1의 상위 5 개 값이 방법을 얻을 수 :

SELECT column1, column2, column3 FROM table ORDER BY column1 DESC LIMIT 5; 

그러나 column2column3의 값이 반드시 그 열에서 가장 큰 값을하지 않을 것입니다 물론, 그들이 될 일이 어떤 값 것 같은 행에있는 가장 큰 값은 column1입니다.

단일 선택 목록에 테이블의 다른 행의 값을 얻을 수있는 유일한 방법은이 자체 조인하는 것입니다 :

SET @i1 = 0, @i2 = 0, @i3 = 0, @i4 = 0, @i5 = 0; 
SELECT * 
FROM (SELECT @i1:[email protected]+1 AS i, column1 FROM table ORDER BY column1 DESC LIMIT 5) t1 ON (t1.i = t5.i) 
JOIN (SELECT @i2:[email protected]+1 AS i, column2 FROM table ORDER BY column2 DESC LIMIT 5) t2 ON (t1.i = t5.i) 
JOIN (SELECT @i3:[email protected]+1 AS i, column3 FROM table ORDER BY column3 DESC LIMIT 5) t3 ON (t1.i = t5.i) 
JOIN (SELECT @i4:[email protected]+1 AS i, column4 FROM table ORDER BY column4 DESC LIMIT 5) t4 ON (t1.i = t5.i) 
JOIN (SELECT @i5:[email protected]+1 AS i, column5 FROM table ORDER BY column5 DESC LIMIT 5) t5 ON (t1.i = t5.i); 

을하지만이 실제 또는 50 개 컬럼에 대해 효율적이지 않습니다 .

또한 데이터베이스 디자인에 대해 궁금합니다. 50 열에서 상위 5 위가 필요한 경우 모두 동일한 종류의 정보를 저장할 수 있습니까? 다중 열 특성 반 패턴을 연습 할 수 있습니다. 그렇다면 모든 50 개의 열을 자식 테이블의 단일 열에 넣어야합니다.

+1

의견을 입력 해주십시오 네가 downvote. –

관련 문제