SQL/MySQL
[MySQL, MariaDB] ROW_NUMBER() 순위함수, 페이징을 위한 다중쿼리
http://portfolio.wonpaper.net
2024. 3. 12. 21:21
row_number() 순위 함수이다. 페이징 작업시 유용하다.
그룹으로 묶어서 순서를 줄때는 partition by 칼럼 을 넣어준다.
ROW_NUMBER() OVER( partition by name order by no asc ) AS RN
SELECT *, ROW_NUMBER() OVER(PARTITION BY name ORDER BY name ASC) AS RN coupon_download where cno=1
다만, 유의할 것은 Mysql 5.5, 5.7 등의 버전에서는 ROW_NUMBER() 가 지원되지 않고 8점대 이상에서 지원됨을 유의
만약 이 ROW_NUMBER() 가 지원안된다면, 다중쿼리로 조금 복잡하게 처리해야 한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
SELECT
@rownum := @rownum + 1 AS rn,
name,
hp
FROM
(
SELECT
name,
hp
FROM
coupon_download
WHERE cno=1
GROUP BY
name,
hp
ORDER BY
name,
hp
) AS t
CROSS JOIN (
SELECT @rownum := 0
) AS r;
|
cs |
이번에는 페이징 처리를 위하여 Limit 10 (레코드수) Offset 0 (페이지 첫번째 순번) 을 넣어보자.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
SELECT
@rownum := @rownum + 1 AS rn,
name,
hp
FROM
(
SELECT
name,
hp
FROM
coupon_download
WHERE cno=1
GROUP BY
name,
hp
ORDER BY
name,
hp
) AS t
CROSS JOIN (
SELECT @rownum := 0
) AS r
LIMIT 10 OFFSET 0;
|
cs |
https://donghodazzi.tistory.com/335
상기 포스팅 글을 보면 쿼리문과 데이터가 잘 나와 있다.
1
2
3
4
5
6
7
8
|
-- 인구수가 많은 순서대로 랭킹 지정하기
SELECT c.*, ROW_NUMBER() OVER(ORDER BY Population DESC) AS rnk
FROM city c ;
-- 도시코드별 인구수 랭킹 지정하기
SELECT c.*, ROW_NUMBER() OVER(PARTITION BY CountryCode ORDER BY Population DESC) AS rnk
FROM city c ;
|
cs |
참고 : https://lab.cliel.com/entry/MariaDB-%EC%88%9C%EC%9C%84-%ED%95%A8%EC%88%98