2009년 7월 31일 금요일

mysql rownum 구현하기

mysql을 쓰다보면 oracle 처럼 rownum을 써야하는 경우가 생긴다.

 

혹은, 자동으로 1씩 증가하는 for 문의 변수(주로 integer i)와 같은 형태의

 

컬럼의 쿼리에서 구현하는 것이 편할 때가 있다.

 

주로 ordering이나 grouping 후 순위를 매길 때가 그런 경우인데,

 

그럴 때 쓸 수 있는 rownum이 mysql에도 있다.

 

ex 1 )

SELECT @RNUM := @RNUM + 1 AS ROWNUM

FROM ( SELECT @RNUM := 0 ) R


 

ex 2 )

SELECT @RNUM := @RNUM + 1 AS ROWNUM, t.*

FROM

  (

    SELECT *

    FROM table

    ORDER BY column1

  ) t,

  ( SELECT @RNUM := 0 ) R


ex 2 처럼 구현하게 되면 ordering 된 상태에서 rownum이

 

0부터 순서대로 부여된다.

 

은근히 자주 쓰이는 편리한 방법이다. ^^

댓글 2개:

  1. 질문이 있습니다. 아무리 여러 게시글을 보고 따라해도 변경이 안되어서요...;;
    jsp 게시판의 나열 쿼리입니다.

    String board_list_sql="select * from "+
    "(select rownum rnum,BOARD_NUM,BOARD_ID,BOARD_SUBJECT,"+
    "BOARD_CONTENT,BOARD_FILE,BOARD_RE_REF,BOARD_RE_LEV,"+
    "BOARD_RE_SEQ,BOARD_READCOUNT,BOARD_DATE from "+
    "(select * from memberboard order by "+
    "BOARD_RE_REF desc,BOARD_RE_SEQ asc)) "+
    "where rnum>=? and rnum<=?";

    오라클 쿼리 입니다. 이것을 mysql 쿼리로 바꾸려고 합니다. 그런데 안되네요...;;
    제가 변경해본 쿼리는

    select @ rnum:= @rnum+1 as rownum,
    from ( select BOARD_NUM,BOARD_ID,BOARD_SUBJECT,
    BOARD_CONTENT,BOARD_FILE,BOARD_RE_REF,BOARD_RE_LEV,
    BOARD_RE_SEQ,BOARD_READCOUNT,BOARD_DATE
    from (select *
    from memberboard
    order by BOARD_RE_REF desc,BOARD_RE_SEQ asc)
    ) as memberboard, (select @rnum:=0)
    where rnum>=? and rnum<=?


    입니다.. 어디를 어떻게 수정해야 할지 혹시 알 수 있을까요?
    테이블은 memberboard 라는 이름의 테이블 하나뿐이 없습니다.
    그 안에 있는 컬럼명은 위의 컬럼명이 전부입니다.!

    답글삭제