[MySQL] ROW_NUMBERS() 함수 쿼리 > db

본문 바로가기
사이트 내 전체검색

db

[MySQL] ROW_NUMBERS() 함수 쿼리

페이지 정보

작성자 서방님 댓글 1건 조회 126회 작성일 11-06-30 15:34

본문

Oracle에는 ROW_NUMBER()라는 함수가 있다. SELECT 문에서 주로 사용하는데 레코드에 번호를 먹여주는 것으로 다음과 같이 나온다.

+----+------------+
|   rk   |     name           |
+----+------------+
|   1    |     Hyun           |
|   2    |     Tacitus         |
+----+------------+

테이블 스키마에 rk 라는 컬럼이 없는데도 위의 경우처럼 결과를 보여준다.

문제는 MySQL은 이것을 지원하지 않는다. 대부분 idx라는 컬럼을 만들고 auto_increament 제약사항을 줘서 Primary key 로 정해서 사용한다. 그래서 row_number()라는 함수가 없어도 필요로 하는 기능을 수행할 수 있다. 그런데 이러한 키가 없을 경우는 어떻게 할 것인가?

검색을 하다보니 이러한 고민이 상당이 많이 나왔고 적당한 해결책을 찾아냈다.
http://jimmod.com/blog/2008/09/displaying-row-number-rownum-in-mysql/

mysql> SELECT @row:=@row+1 as rk, it.TABLE_SCHEMA, it.TABLE_NAME FROM (SELECT @row:=0) AS r, INFORMATION_SCHEMA.TABLES AS it WHERE it.TABLE_NAME='xe_session';

mysql 5.x의 INFOMATION_SCHEMA에 번호를 먹여봤다. 'xe_session'이라는 테이블을 가진 데이터베이스를 검색하는 쿼리인데 스키마에는 rk가 없다. 그래서 위의 쿼리처럼 임의로 rk를 지정해줄 수 있다.

그런데 rk는 말했다시피, 레코드의 컬럼이 아니다. 그래서 WHERE 조건문에서 사용할 수 없다. rk를 이용해서 특정 번호 이상 혹은 이전값을 가지고 와야할 경우가 생기는데 그럴때는 새롭게 가상의 테이블을 만든다.

mysql> SELECT * FROM  (SELECT @row:=@row+1 as rk, it.TABLE_SCHEMA, it.TABLE_NAME FROM (SELECT @row:=0) AS r, INFORMATION_SCHEMA.TABLES AS it WHERE it.TABLE_NAME='xe_session') rank WHERE rk > 10
mysql> SELECT * FROM  (SELECT @row:=@row+1 as rk, it.TABLE_SCHEMA, it.TABLE_NAME FROM (SELECT @row:=0) AS r, INFORMATION_SCHEMA.TABLES AS it WHERE it.TABLE_NAME='xe_session') rank WHERE rk BETWEEN 10 AND 24

Mysql도 가능하다.

댓글목록

서방님님의 댓글

서방님 작성일

<p><strong>set @row_number=0;</strong></p>
<p><strong>select *, (@row_number:=@row_number+1)as row_number from</strong> <font color="#3058d2"><strong>테이블명</strong></font><br /><br /></p>

Total 464건 13 페이지
게시물 검색

회원로그인

접속자집계

오늘
134
어제
225
최대
1,347
전체
154,893
Latest Crypto Fear & Greed Index

그누보드5
Copyright © 서방님.kr All rights reserved.