MySQL - rownum, rank, SQL_CALC_FOUND_ROWS

2017. 11. 29. 16:09plming/DB

Oracle의 RANK() OVER 같은 결과를 만들어 낼 수 있는 SQL이다.

 

특정 Key1를 기준으로

해당 Key1내에서 Key2를 기준으로 순위를 만드는 SQL이다.

 

(아래에서는 rnum을 기준으로, created에 따라서 순위를 만들고 있다.)

 

 SELECT *
 FROM ( SELECT a2.*
                    , @rn := CASE WHEN @key1 != rnum THEN 1 ELSE @rn + 1 END AS rank
                    , @rk := CASE WHEN @rn = 1 THEN 1
                                       WHEN @key2 = created THEN @rk
                                       ELSE @rn
                                END AS tmp_val
                    , @key1 := rnum
                    , @key2 := created
        FROM (
                    SELECT ... AS rnum
                            , ... AS created
                    :::
                 ) a2
               , ( SELECT @key1 := '', @key2 := '', @rn := 0, @rk = 0
                 ) b2
 ) x2
 WHERE  rank <= 3
 ORDER BY rnum, rank
 ;

 

 

 SELECT SQL_CALC_FOUND_ROWS *
 FROM ( SELECT @rownum := @rownum + 1 AS RNUM, a2.*
            FROM ( SELECT ...
                       ORDER BY ...
            ) a2
            JOIN ( SELECT @rownum:=0 ) R
 ) x2
 LIMIT 페이지당줄수 OFFSET ((페이지번호-1) * 페이지당줄수)
 ;

 

* 윗 명령에서 LIMIT OFFSET으로 자르기 이전의

  전체 Row의 수를 조회

  (이를 위해 SQL_CALC_FOUND_ROWS를 (반드시 첫줄에) 붙여서 조회하고, LIMIT 해야 한다.)

 

 SELECT FOUND_ROWS() AS RCNT
 ;


 

 

'plming > DB' 카테고리의 다른 글

MySQL - 시간 간격 계산  (0) 2018.05.16
MySQL - Temp Table is full, 크기 조절  (0) 2018.01.11
MySQL - Select한 값으로 Update  (0) 2017.11.28
MySQL - 임의의 날짜값 생성  (0) 2017.11.14
[MySQL] millisecond, microsecond 표시하기  (0) 2017.10.16