Web 에서 Mysql 을 쓰다 보면 데이터를 Pagination 해야할 때가 있다.
그럴 때 UNIQUE 하지 않은 데이터를 기준으로 정렬해야 할 때 주의할 점을 소개한다.
1 2 3 4 5 6
| create table snippet(id INT, val INT); insert into snippet values(1,1); insert into snippet values(2,1); insert into snippet values(10,1); insert into snippet values(3,1);
|
위와 같이 데이터를 넣고 (물론 KEY 는 id 이다)
1 2 3 4 5 6 7 8 9
| select * from snippet order by val limit 0, 2; -> (3, 1) (2, 1) select * from snippet order by val limit 2, 2; -> (10, 1) (3, 1)
|
이런 식으로 나오는 결과가 있다. 이러한 이유는 ORDER BY 로 뽑아내는 값이 DB의 데이터 저장 환경에 따라 달라질 수 있기 때문이다.
그래서 UNIQUE 한 순서로 나오도록 정렬해야 한다. 다음과 같은 방법을 추천한다.
1 2 3
| select * from snippet order by val, id limit 0, 2; select * from snippet order by val, id limit 2, 2;
|
위와 같은 방법으로 UNIQUE 한 결과를 얻을 수 있어 Pagination 시 버그가 생기지 않는다.
물론 아무도 이런 식으로 Production 제품을 코딩하진 않았을 것으로 믿는다.
찾아보니 비슷한 질문을 한 사람도 있더라 ㅋㅋㅋ