이러한 종류의 쿼리는 "그룹당 최대"점수가 'foo'값인 상위 "그룹당"의 의미로 해석 될 수 있습니다.
이 질문에 기쁨을내어 this link을 살펴 보시고, 쿼리를 수행하고 점진적으로 최적화하는 방법으로 시작하는 것이 좋습니다.
set @num := 0, @foo := '';
select foo, score
from (
select foo, score,
@num := if(@foo = foo, @num + 1, 1) as row_number,
@foo := foo as dummy
from tablebar
where foo IN ('abc','def')
order by foo, score DESC
) as x where x.row_number <= 10;
당신이 foo
의 모든 수준에 걸쳐이 작업을 수행하고자한다면
(즉,이
GROUP BY foo
을하고 상상), 당신은
where foo in ...
라인을 생략 할 수 있습니다.
는 기본적으로 내부 쿼리 (SELECT foo, score FROM tablebar WHERE foo IN ('abc','def') ORDER BY foo, score DESC
)는 내림차순 점수를 다음 foo
에 의해 처음으로 주문하고, 테이블에서 foo
및 score
을 잡고.
@num := ...
은 모든 행의 값이 증가하며, 각각의 새로운 값인 foo
마다 1로 재설정됩니다. 즉, @num
은 행 번호/순위 일뿐입니다 (의미를 보려면 자체 쿼리를 실행 해보십시오).
외부 쿼리는 그 다음 순위/로우 수가 10 이하인 행을 선택
참고
가
UNION
와 원래 검색어가 중복 제거 그렇다면 foo='abc'
대한 상위 10 득점 가 모두 100이면 (foo,score)
쌍이 10 번 복제되므로 하나의 행만 반환됩니다. 이것은 중복을 반환합니다.
대담하게도 현재 성능에 근접한 해결책이 있습니다. – zerkms