MY-SQL

 넘버링, 번호 자동 매기기, 행 번호 자동 증가

 

 

위와 같이 구글링하면 MySQL 관련 글들을 발견할 수 있다.

목적은 아래처럼 SELECT 쿼리의 검색 결과에 단순히 1씩 증가하는 번호를 붙이고자하는 것이다.

 

 

UserID

UserName

Duty

SEQ

 hgd

 홍길동 

 사장

 1

 jjh

 전지현

 상무이사

 2

 lss

 클라라

 상무이사 

 3

 

 

 


 mysql> SELECT *, @SEQ := @SEQ+1 AS SEQ FROM B, (SELECT @SEQ := 0) A;

 

결과적으로 위 쿼리를 실행해 보면 B 테이블의 조회 결과에 1부터 증가하는 SEQ가 따라붙게 된다.

 

아래처럼 쿼리가 조금 복잡해지면 어떻게 될까?

 


 mysql> SELECT userinfo.id AS SIPAddress, userinfo.kname AS UserName, org_duty.duty_name AS UserTitle, userinfo.depart_code AS ParentDeptCode, @SEQ := @SEQ+1 AS SEQ
FROM userinfo
JOIN org_duty ON userinfo.duty_no=org_duty.duty_no, (SELECT @SEQ := 0) A
ORDER BY userinfo.depart_code, org_duty.priority_level DESC, userinfo.kname;

 

실행해 보면 SEQ 값이 올바르게 정렬되지 않았고 뒤섞여 있다(join 때문).

아래처럼 서브쿼리를 사용하면 원하는 순서대로 번호를 매길 수 있다.

 

 


 mysql> SELECT SIPAddress, UserName, UserTitle, @SEQ := @SEQ+1 AS Sequence, ParentDeptCode
FROM
(SELECT userinfo.id AS SIPAddress, userinfo.kname AS UserName, org_duty.duty_name AS UserTitle, userinfo.depart_code AS ParentDeptCode
FROM userinfo
INNER JOIN org_duty ON userinfo.duty_no=org_duty.duty_no
ORDER BY userinfo.depart_code, org_duty.priority_level DESC, userinfo.kname)
AS tbl, (SELECT @SEQ := 0) A

 

 

왜 이런 방식을 사용하느냐?

 

ORACLE이라면 row_number() over()라는 좋은 함수가 있지만 MySQL에는 그런 함수가 없다.

대신 TABLe에 AUTO_INCREMENT 필드를 만들어 INSERT 시점에 자동 증가시키는 기능이 있고,

DB에서 불러온 후 소스 코드 내에서 번호를 붙이면 되기 때문에 딱히 불편할건 없다.

 

하지만 MySQL 뷰 테이블을 생성하는 경우 변수와 서브 쿼리를 사용할 수 없으므로 좀 더 난해해진다.

뷰 테이블 자체를 order by 구문 포함해서 만들면 되고 여러가지 방법이 있으므로 더 깊게 알아볼 필요는 없을것 같다.



출처: http://whiterussian.tistory.com/43 [화이트 러시안]

 

about author

PHRASE

Level 60  머나먼나라

민주주의에 대한 나의 개념은, 그 체제하에서는 가장 약한 자가 가장 강한 자와 똑같은 기회를 가질 수 있다는 것이다. -간디

댓글 ( 4)

댓글 남기기

작성