랭킹이 있는 리스트에서 특정 위치의 데이터를 추출하고 싶습니다. 0 6 636

by 석이 [MySQL] [2018.04.03 21:12:59]


안녕하세요. 초보 개발자 석이라고 합니다.

정보들을 읽으면서 많은 도움을 받고있었는데, 두번째 질문을 올리게 되었습니다.

여기서 글을 읽을때마다 정말 대단하신분이 너무나 많다고 느껴집니다...

 

아래와 같은 테이블의 결과에서 제품별로 리뷰의 숫자가 가변적일때, 특정 숫자를 변수로 받아서 해당 위치의 랭킹과 연결되는 데이터를 추출하고 싶습니다.

제품 리뷰 사용자 평가 랭킹
노트북 A 9.5 1
노트북 B 8 2
노트북 C 5 3
데스크탑 D 7 1
데스크탑 E 3 2

 

1이 입력된다면 => 노트북,A,9.5,1 | 데스크탑,D,7,1

2가 입력된다면 => 노트북,B,8,2,2 | 데스크탑,E,3,2

3이 입력된다면 => 노트북,C,5,3 | 데스크탑,D,7,1   :리스트의 길이가 입력된 변수보다 작을경우 % 연산을 이용...

 

입력되는 변수는 프로그래밍 레벨에서 섞어서 쿼리로 입력할 계획입니다!

이러한 형태의 결과를 얻고 싶습니다.. 가능한 이슈인지 정확히 모르겠네요..

 

읽어주셔서 감사합니다.

 

by 웅 [2018.04.04 08:38:38]

3이 입력된다면 => 노트북,C,5,3 | 데스크탑,D,7,1   :리스트의 길이가 입력된 변수보다 작을경우 % 연산을 이용...

굵게 표시된 사유가 랭킹 3에 해당하는 데스크탑 데이터가 없으면 데스탑 첫번째 값이 나오는건가요?


by 석이 [2018.04.04 10:57:38]

네 그렇습니다! 데이터가 부족할 경우 매칭되는 데이터를 한개는 꼭 뽑고싶어서요. 그래서 %연산을 이용해서 응용해서 사용하려고 했습니다.


by 마농 [2018.04.04 08:53:54]
SELECT a.제품, a.리뷰사용자, a.평가
     , COUNT(b.제품) + 1 랭킹
  FROM t a
  LEFT OUTER JOIN t b
    ON a.제품 = b.제품
   AND a.평가 < b.평가
 GROUP BY a.제품, a.리뷰사용자, a.평가
HAVING COUNT(b.제품) + 1 = :v_랭킹
;

 


by 마농 [2018.04.04 09:01:03]

아! 질문에 모호한 부분이 있었네요?
3 입력시 1등이 나와야 하는건가요?
왜 그래야 하는지 명확한 설명 필요합니다.
다른 예도 필요해 보입니다. (4를 입력했을 경우, 5를 입력했을 경우 등)

예에서는 평가에 대한 동순위가 없는데
동순위가 있을 때 처리 기준이 따로 있는지?
MySQL 은 분석함수가 없어서 까다롭습니다.
요구사항을 좀더 명확하게 해주세요.


by 석이 [2018.04.04 11:00:19]

특정 값을 입력받았을때, 최대한 중복을 없게 데이터를 매칭하고자 데이터가 부족할 경우 %연산을 사용하여 해당 위치와 매핑하려고했습니당!

랭킹에 대해서 동순위는 따로 없습니다.

HAVING절을 이용해서 특정 위치를 찾아볼생각은 못해봤네요!

답변감사드립니다~!!!


by 마농 [2018.04.04 09:31:02]
SELECT a.제품, a.리뷰사용자, a.평가
     , COUNT(c.제품) + 1 랭킹
  FROM t a
 INNER JOIN
       (SELECT 제품
             , COUNT(*) cnt
          FROM t
         GROUP BY 제품
        ) b
    ON a.제품 = b.제품
  LEFT OUTER JOIN t c
    ON a.제품 = c.제품
   AND a.리뷰사용자 != c.리뷰사용자
   AND ( (a.평가 < c.평가) OR
         (a.평가 = c.평가 AND a.리뷰사용자 > c.리뷰사용자)
         -- 동점인 경우 id 가 작은 사람을 우선 순위로 --
       )
 GROUP BY a.제품, a.리뷰사용자, a.평가, b.cnt
HAVING COUNT(c.제품) + 1 = (:v_랭킹 - 1) % b.cnt + 1
;

 

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입