각 열의 최대 값 5 개가 고유 한 행에서 발생할 수 있다고 가정 할 때 50 개의 쿼리에서이 작업을 수행해야합니다.
설명 : SQL 쿼리 의 선택 목록에있는 표현식은이 같은 행을 참조해야합니다. 그래서 당신은 column1
의 상위 5 개 값이 방법을 얻을 수 :
SELECT column1, column2, column3 FROM table ORDER BY column1 DESC LIMIT 5;
그러나 column2
및 column3
의 값이 반드시 그 열에서 가장 큰 값을하지 않을 것입니다 물론, 그들이 될 일이 어떤 값 것 같은 행에있는 가장 큰 값은 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 개의 열을 자식 테이블의 단일 열에 넣어야합니다.
이것은 해결책이지만, 50 개 이상의 중첩 된 선택 쿼리를 피하기 위해 더 짧은 방법을 쓰고 있습니다. 계산하기가 무거울까요? –
-1 하위 쿼리는 둘 이상의 행을 반환 할 수 없습니다. – Andomar
@Andomar 예 가능합니다. 방금 시험 했어. 그러나 당신은 그들에게 별명을 붙여야한다. 나는이 포스트에서 놓친다. 지금 고쳤다. – Verhogen