조인 테이블을 사용한 MySQL Greatest N 결과

룩배 저스

상위 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] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

조인 테이블을 기반으로 한 MySQL 제한 결과

분류에서Dev

mysql-조인을 사용하여 동일한 테이블에 쿼리 결과 삽입

분류에서Dev

MySQL \ 두 테이블을 조인하고 한 열에 두 행의 결과 표시

분류에서Dev

mysql 내부 조인을 사용한 고유 한 결과

분류에서Dev

mysql 내부 조인을 사용한 고유 한 결과

분류에서Dev

두 테이블을 사용한 내부 조인 및 다른 테이블과 결과를 왼쪽 조인

분류에서Dev

참조 테이블을 사용한 MYSQL 다중 조인

분류에서Dev

Spark SQL을 사용하여 동일한 테이블의 두 결과를 조인

분류에서Dev

쿼리 별칭을 사용하여 다른 테이블 MySQL과 조인

분류에서Dev

3 개의 테이블 MySql을 사용한 내부 조인

분류에서Dev

3 개의 테이블을 사용한 MySQL 내부 조인

분류에서Dev

왼쪽 조인을 사용한 MySql 다중 테이블 쿼리

분류에서Dev

mysql, WHERE 절을 사용한 다중 테이블 조인

분류에서Dev

다중 조인을 사용하는 mysql sum () 및 이중 결과

분류에서Dev

다른 테이블과의 자연 조인에서 필드를 사용하여 한 테이블에서 mySQL DELETE?

분류에서Dev

Postgres 측면 조인 여러 테이블을 결과 제한

분류에서Dev

MySQL-CASE 문과 조회 테이블을 사용합니까?

분류에서Dev

mysql / php를 사용하여 여러 테이블에 걸쳐 여러 조인에서 여러 결과 반환

분류에서Dev

MySQL은 사용자 테이블을 다른 테이블과 결합

분류에서Dev

테이블을 조인하고 모든 결과를 표시합니다. php mysql?

분류에서Dev

조인 테이블의 최신 행을 기반으로 MySQL 결과 선택

분류에서Dev

mysql은 더 많은 조인 테이블과 결합을 수행합니다.

분류에서Dev

MySQL의 조인 결과에 따라 테이블 업데이트

분류에서Dev

PHP mysql 두 테이블을 조인하여 한 테이블에서 이름을 연결하고 다른 테이블에서 게시하는 방법

분류에서Dev

Linq-한 쿼리의 결과 집합을 다른 테이블과 조인

분류에서Dev

MYSQL : 두 테이블을 쿼리하고 두 번째 테이블의 결과를 배열에 조인

분류에서Dev

mysql 조인 2 테이블 필터링 결과

분류에서Dev

mysql 두 테이블 조인 합계가 같지 않은 결과

분류에서Dev

조인 결과에 따라 mysql 테이블에 삽입

Related 관련 기사

  1. 1

    조인 테이블을 기반으로 한 MySQL 제한 결과

  2. 2

    mysql-조인을 사용하여 동일한 테이블에 쿼리 결과 삽입

  3. 3

    MySQL \ 두 테이블을 조인하고 한 열에 두 행의 결과 표시

  4. 4

    mysql 내부 조인을 사용한 고유 한 결과

  5. 5

    mysql 내부 조인을 사용한 고유 한 결과

  6. 6

    두 테이블을 사용한 내부 조인 및 다른 테이블과 결과를 왼쪽 조인

  7. 7

    참조 테이블을 사용한 MYSQL 다중 조인

  8. 8

    Spark SQL을 사용하여 동일한 테이블의 두 결과를 조인

  9. 9

    쿼리 별칭을 사용하여 다른 테이블 MySQL과 조인

  10. 10

    3 개의 테이블 MySql을 사용한 내부 조인

  11. 11

    3 개의 테이블을 사용한 MySQL 내부 조인

  12. 12

    왼쪽 조인을 사용한 MySql 다중 테이블 쿼리

  13. 13

    mysql, WHERE 절을 사용한 다중 테이블 조인

  14. 14

    다중 조인을 사용하는 mysql sum () 및 이중 결과

  15. 15

    다른 테이블과의 자연 조인에서 필드를 사용하여 한 테이블에서 mySQL DELETE?

  16. 16

    Postgres 측면 조인 여러 테이블을 결과 제한

  17. 17

    MySQL-CASE 문과 조회 테이블을 사용합니까?

  18. 18

    mysql / php를 사용하여 여러 테이블에 걸쳐 여러 조인에서 여러 결과 반환

  19. 19

    MySQL은 사용자 테이블을 다른 테이블과 결합

  20. 20

    테이블을 조인하고 모든 결과를 표시합니다. php mysql?

  21. 21

    조인 테이블의 최신 행을 기반으로 MySQL 결과 선택

  22. 22

    mysql은 더 많은 조인 테이블과 결합을 수행합니다.

  23. 23

    MySQL의 조인 결과에 따라 테이블 업데이트

  24. 24

    PHP mysql 두 테이블을 조인하여 한 테이블에서 이름을 연결하고 다른 테이블에서 게시하는 방법

  25. 25

    Linq-한 쿼리의 결과 집합을 다른 테이블과 조인

  26. 26

    MYSQL : 두 테이블을 쿼리하고 두 번째 테이블의 결과를 배열에 조인

  27. 27

    mysql 조인 2 테이블 필터링 결과

  28. 28

    mysql 두 테이블 조인 합계가 같지 않은 결과

  29. 29

    조인 결과에 따라 mysql 테이블에 삽입

뜨겁다태그

보관