프로그램 개발서

rownum 데이터를 다시 정렬하여 rownum번호 사용하기 본문

Web

rownum 데이터를 다시 정렬하여 rownum번호 사용하기

rairen 2018. 10. 19. 12:13

MySql에서 rownum을 쓰기 위해서 '@rownum := @rownum + 1 ' 을 많이 쓰고 있을 것이다.


개발을 하는 과정에서


특정 컬럼으로 정렬한 데이터에 rownum을 매기고 다른 컬럼으로 정렬하여 rownum 순서가 바뀌어서 보이려고 할 경우는 어떻게 해야하는가 였다.



쿼리를 구성을 할 때는 데이터에 rownum과 정렬 된 것을 서브쿼리로 잡고 가 밖에서 한번더 정렬을 하면 될 것으로 생각하고 작업을 했으나 생각대로 되지 않아 몇 시간 고민했던 사항이다.



그러나 다르게 생각하여 작업을 진행하니 간단하게 풀린 문제이기도 햇다.



SELECT * AS count FROM
(
SELECT t2.* , @rownum := @rownum + 1 AS rank_number
FROM
(
SELECT
*
FROM `table1`
JOIN (SELECT @rownum := 0) r
ORDER BY culumn2 DESC
) AS t2
) AS t

ORDER BY t.culumn3 ASC

위의 소스는 해결한 쿼리이다.


해결방법 순서를 정리하면


1. 정렬데이터를 가져오는 쿼리를 만든다.

SELECT
*
FROM `table1`
JOIN (SELECT @rownum := 0) r
ORDER BY culumn2 DESC

2. rownum을 매기는 쿼리에 서브쿼리로 넣는다.

SELECT t2.* , @rownum := @rownum + 1 AS rank_number
FROM
(
SELECT
*
FROM `table1`
JOIN (SELECT @rownum := 0) r
ORDER BY culumn2 DESC
) AS t2

이러면 culumn2 로 정렬된 데이터에 rownum이 들어가게 된다.


3. rownum이 새겨진 쿼리를 서브쿼리로 하여 다른 컬럼으로 정렬하는 쿼리안에 넣는다.

SELECT t.* FROM
(
SELECT t2.* , @rownum := @rownum + 1 AS rank_number


FROM

(

SELECT

*

FROM `table1`

JOIN (SELECT @rownum := 0) r

ORDER BY culumn2 DESC

) AS t2

) AS t
ORDER BY culumn3 ASC


이렇게 하면 완성이다.


결과 데이터로 만들어보면 보면


culumn  |  culumn2  |  culumn3 | rownum

============================

1          |      50      |     51      |     2

2          |      40      |     45      |     3

3          |      80      |     86      |     1


이런 데이터가 만들어진다.


많이 쓰이진 않을지라도 알아두면 응용해서 사용할 일이 많을 것 같다는 생각을 한 문제였다.


크게 보면 몰라도 문제가 될 여지는 없으나 알아두면 좋을 것 같다.



반응형