넘버링, 번호 자동 매기기, 행 번호 자동 증가 |
위와 같이 구글링하면 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 [화이트 러시안]
댓글 ( 4)
댓글 남기기