본문 바로가기
web/DB

[mysql] 행 번호 rownum 출력하기(역순, join table)

by fien 2020. 12. 24.

 

게시판의 글들을 최신순으로 출력하는데 글번호나 순서를 매기고 싶을 때

즉, 쿼리를 실행하고 정렬한 결과에 순서를 주는 경우

임의의 변수(ROWNUM)를 선언하여 이를 수행할 수 있다.

 

1. 행번호 출력하기

SELECT @ROWNUM:=@ROWNUM+1 AS ROWNUM
     , *
  FROM ( SELECT @ROWNUM := 0) R
     , POST P
 WHERE P.CONTENT LIKE CONCAT('%','내용무','%')
 ORDER BY REG_DATE DESC;

mysql 에서 @는 변수를 의미한다.

쿼리에서 행 번호를 출력하기 위해 FROM 절에서 ROWNUM이라는 변수를 선언하고

SELECT 절에서 변수를 1씩 증가시켜서 출력한다.

 

2. 행번호 역순으로 출력하기

SELECT *
  FROM ( SELECT @ROWNUM:=@ROWNUM+1 AS ROWNUM
              , *
           FROM ( SELECT @ROWNUM := 0) R
              , POST P
          WHERE P.CONTENT LIKE CONCAT('%','내용무','%')
          ORDER BY REG_DATE ASC ) SUB
 ORDER BY ROWNUM DESC;

역순으로 행번호를 주기 위해서는 서브쿼리를 사용하고 ROWNUM을 역순으로 출력하면 된다.

이때 서브쿼리에서의 오더를 기존 쿼리의 반대로 줘야한다.

 

3. JOIN table 후에 행번호 역순으로 출력하기

(잘못된 예시)

SELECT SUB.*
  FROM (SELECT @rownum:=@rownum+1 AS RNUM
             , P.CONTENT
             , U.USER_NAME
          FROM ( SELECT @ROWNUM :=0 ) R 
             , POST P
         INNER JOIN ( SELECT USER_ID
                           , USER_NAME
                        FROM USER ) U
            ON P.USER_ID = U.USER_ID
         WHERE P.CONTENT LIKE CONCAT('%','내용무','%') 
         ORDER BY REG_DATE ASC
       ) SUB
 ORDER BY RNUM DESC;

JOIN을 하는 경우에 전의 코드를 바탕으로 JOIN 절 만 넣어주면 될 것 같지만

결과는 예상대로 나오지 않는다.

아마 서브쿼리의 SELECT 부터 WHERE 까지의 결과가 나온 이후에 ORDER BY를 적용하기 때문인 것 같다. 

SELECT @rownum:=@rownum+1 AS RNUM
     , SUB.*
  FROM (SELECT P.CONTENT
             , U.USER_NAME
          FROM ( SELECT @ROWNUM :=0 ) R 
             , POST P
         INNER JOIN ( SELECT USER_ID
                           , USER_NAME
                        FROM USER ) U
            ON P.USER_ID = U.USER_ID
         WHERE P.CONTENT LIKE CONCAT('%','내용무','%') 
         ORDER BY REG_DATE ASC
       ) SUB
 ORDER BY RNUM DESC;

따라서 위의 코드와 같이 rownum에 대한 출력을 서브쿼리 바깥에서 해주고

서브쿼리의 정렬은 마찬가지로 기존 쿼리의 반대로 해준다.

 

4. JOIN table 후에 행번호 순서대로 출력하기

SELECT @rownum:=@rownum+1 AS RNUM
     , SUB.*
  FROM (SELECT P.CONTENT
             , U.USER_NAME
          FROM ( SELECT @ROWNUM :=0 ) R 
             , POST P
         INNER JOIN ( SELECT USER_ID
                           , USER_NAME
                        FROM USER ) U
            ON P.USER_ID = U.USER_ID
         WHERE P.CONTENT LIKE CONCAT('%','내용무','%') 
         ORDER BY REG_DATE DESC
       ) SUB
       ;

순서대로 행번호를 매기고 싶다면 서브쿼리에서 ORDER를 원래대로 해주고 바깥에서도 별도의 정렬을 하지 않으면 된다.

 

 

 

댓글