상위 n 개의 결과를 선택하면서 여기에서 수행하는 방법에 대한 수많은 게시물과 훌륭한 기사를 보았지만 데이터 세트로 수행하기 위해 고군분투하고 있습니다. 대부분의 예제는 추가 조인없이 데이터 세트에 중점을 둡니다.
저는 http://www.xaprb.com/blog/2006/12/07/how-to-select-the-firstleastmax-row-per-group-in-sql/ 의 예제 를 내 많은 성공없이 쿼리.
Person, Credit 및 Media에는 세 개의 테이블이 있습니다.
개인은 크레딧에 연결되고 미디어에 대한 크레딧은 연결됩니다.
아래 쿼리는 1 인당 상위 5 개 미디어를 반환해야하지만 그렇지 않습니다. 어디에서 잘못 했나요?
SELECT
p.id AS person_id,
c.id AS credit_id,
m.id AS media_id, m.rating_average
FROM person p
INNER JOIN credit c ON c.person_id = p.id
INNER JOIN media m ON m.id = c.media_id
where (
select count(*) from media as m2
inner JOIN credit c2 on m2.id=c2.media_id
where c2.person_id = c.person_id and m2.rating_average >= m.rating_average
) <= 5
설명:
상위 미디어는 rating_average가 가장 높은 미디어에서 계산됩니다.
최신 정보:
SQLFiddle http://sqlfiddle.com/#!9/eb0fd
1 인당 상위 3 개 미디어 (m)에 대한 원하는 출력 (p). 분명히 상위 5 개 미디어에 대해이 작업을 수행하고 싶지만 이것은 테스트 데이터 일뿐입니다.
p m c rating_average
1 9 27 9
1 7 28 8
1 1 1 8
2 1 5 8
2 4 8 8
2 7 29 8
3 4 10 8
3 3 9 6
3 5 11 5
4 3 13 6
4 5 14 5
4 6 15 3
5 4 16 8
5 5 17 5
5 6 18 3
6 6 19 3
7 7 20 8
8 9 23 9
8 1 21 8
8 8 22 0
9 1 24 8
9 7 26 8
9 5 25 5
나는 그것을 해결한다고 생각한다 :)
먼저 시작 방법을 기반으로 한 하나의 솔루션이 있습니다. 그러나 각 person_id에 대해 정확한 3 (또는 내가 선택한 숫자 3) 행을 표시하기 위해 해결할 수없는 문제가 있습니다. 문제는 해당 솔루션이 rating_average가 현재 행보다 큰 행 수를 계산하는 것입니다. 따라서 5 개의 동일한 상위 값이있는 경우 5 개를 모두 표시하거나 전혀 표시하지 않도록 선택할 수 있으며 이는 좋지 않습니다. 그래서 여기에 그렇게하는 방법이 있습니다 ... (물론 이것은 당신이 4 개의 최고 가치를 가지고 있다면 그것들을 모두 보여주는 예입니다 (데이터를 보여주지 않는 것은 전혀 의미가 없다고 생각합니다)) ...
SELECT t1.person_id, t1.credit_id, t1.media_id, t1.rating_average
FROM (SELECT p.id AS person_id, c.id AS credit_id, m.id AS media_id,
m.rating_average AS rating_average
FROM person p
INNER JOIN credit c ON c.person_id = p.id
INNER JOIN media m ON m.id = c.media_id) as t1
WHERE (SELECT COUNT(*)
FROM (SELECT p.id AS person_id, c.id AS credit_id, m.id AS media_id,
m.rating_average AS rating_average
FROM person p
INNER JOIN credit c ON c.person_id = p.id
INNER JOIN media m ON m.id = c.media_id) AS t2
WHERE t2.person_id = t1.person_id AND t2.rating_average > t1.rating_average) < 3
ORDER BY person_id ASC, rating_average DESC
중요 : 이 솔루션은 자신을 반복하는 값이없는 경우 각 사람에 대해 정확한 3 개의 행을 표시하기 위해 작동 할 수 있습니다. 여기에 Fiddle http://sqlfiddle.com/#!9/eb0fd/64가 있습니다. person_id가 1 인 문제를 볼 수 있습니다!
그 후 나는 조금 더 연주하고 내가 생각하는 질문에서 원하는대로 작동하도록 만듭니다. 이에 대한 코드는 다음과 같습니다.
SET @num := 0, @person := 0;
SELECT person_id, credit_id, media_id, rating_average, rowNumber
FROM (SELECT t1.person_id, t1.credit_id, t1.media_id, t1.rating_average,
@num := if(@person = t1.person_id, @num + 1, 1) AS rowNumber,
@person := t1.person_id
FROM (SELECT p.id AS person_id, c.id AS credit_id, m.id AS media_id,
m.rating_average AS rating_average
FROM person p
INNER JOIN credit c ON c.person_id = p.id
INNER JOIN media m ON m.id = c.media_id
ORDER BY p.id ASC, m.rating_average DESC) as t1) as t2
WHERE rowNumber <= 3
여기 바이올린은입니다 http://sqlfiddle.com/#!9/eb0fd/65 ...
GL!
추신 : 내 영어에 대해 죄송합니다. 내가 말한 것을 이해할 수 있기를 바랍니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다