게시판의 글들을 최신순으로 출력하는데 글번호나 순서를 매기고 싶을 때
즉, 쿼리를 실행하고 정렬한 결과에 순서를 주는 경우
임의의 변수(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를 원래대로 해주고 바깥에서도 별도의 정렬을 하지 않으면 된다.
'web > DB' 카테고리의 다른 글
[mybatis/mysql] mysql procedure 사용 시 OUT parameter 오류 해결 방법 (2) | 2021.11.02 |
---|---|
[mysql] 암호화 & 복호화, 인코딩&디코딩 (0) | 2021.07.01 |
[mysql] windows 'mysql'은(는) 내부 또는 외부 명령, 실행할 수 있는 프로그램, 또는 배치 파일이 아닙니다. /mysql 환경 변수 설정하기 (7) | 2021.04.08 |
댓글