[MySQL] 랭킹 관련해서 질문 드립니다.. 0 4 1,403

by 이송주 [MySQL] MySQL 랭킹 [2016.07.27 12:38:13]


물고기 크기 순으로 랭킹을 산출하려고합니다.

물고기 크기 순(유저 당 가장 큰 사이즈 1개) 1, 2, 3위와 내 순위의 위아래 2명씩을 찾아내는 쿼리를 작성하려고 하는데

제 수준에는 많이 어려운 것 같습니다. 힌트나 도움좀 주시면 감사하겠습니다.

 

테이블명 RACE_FISH

컬럼 USER_INDEX, FISH_SIZE

by 마농 [2016.07.27 13:21:31]

동순위 처리는 어찌 하나요?
 - 3등까지 뽑아야 하는데 3등이 여러명인 경우
 - 내 앞에 두명을 뽑아야 하는데 3명이 동순위인 경우


by 이송주 [2016.07.27 13:41:43]

물고기를 잡은 시간(CREATE_DATE)로 동순위 처리를 하려고 합니다.


by 마농 [2016.07.27 14:16:36]
-- 1. 테스트용 테이블 생성 --
CREATE TABLE race_fish
AS
SELECT 1 user_index, 9 fish_size, '13:00' create_date
UNION ALL SELECT 1, 8, '12:00'
UNION ALL SELECT 1, 9, '11:00'
UNION ALL SELECT 2, 6, '13:00'
UNION ALL SELECT 2, 7, '12:00'
UNION ALL SELECT 2, 8, '11:00'
UNION ALL SELECT 3, 8, '13:00'
UNION ALL SELECT 3, 7, '12:00'
UNION ALL SELECT 3, 6, '11:00'
UNION ALL SELECT 4, 7, '13:00'
UNION ALL SELECT 5, 6, '11:00'
UNION ALL SELECT 6, 6, '11:01'
UNION ALL SELECT 7, 5, '11:00'
UNION ALL SELECT 8, 4, '11:00'
UNION ALL SELECT 9, 3, '11:00'
;

-- 2. 순위 구하기 --
SELECT user_index
     , fish_size
     , create_date
     , rk
  FROM (SELECT user_index
             , fish_size
             , create_date
             , @rk := @rk + 1 AS rk
             , CASE user_index WHEN @My_ID THEN @My_rk := @rk END
          FROM (SELECT b.user_index
                     , b.fish_size
                     , MIN(b.create_date) create_date
                  FROM (SELECT user_index
                             , MAX(fish_size) fish_size
                          FROM race_fish
                         GROUP BY user_index
                        ) a
                 INNER JOIN race_fish b
                    ON a.user_index = b.user_index
                   AND a.fish_size  = b.fish_size
                 GROUP BY b.user_index, b.fish_size
                 ORDER BY fish_size DESC, create_date ASC, user_index ASC
                ) a
             , (SELECT @rk    := 0  -- 순위
                     , @My_rk := 0  -- 내 순위
                     , @My_ID := 7  -- 내 ID
                ) b
        ) a
 WHERE rk IN (1, 2, 3, @My_rk-2, @My_rk-1, @My_rk, @My_rk+1, @My_rk+2)
;

 


by 이송주 [2016.07.27 14:20:10]

헉.. 감사합니다!

검색해보니 대부분의 쿼리들이 변수를 사용해서 하는것들이었는데

쿼리가 상당히 복잡하네요 @.@ 열심히 공부하겠습니다!

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