MySQL 5.6 버전에서 유일성을 가지지 않은 필드를 order by 절에 넣을때 limit 조건과 문제가 발생하나요?

조회수 1036회

안녕하세요 MySQL 쿼리에 대해 질문이 있어 글을 올립니다. 쿼리를 게시판 리스트 형식으로 던지게 되는데, 쿼리는 아래와 같습니다.

1page

select * from table_name where ~~~~ order by DueDate limit 0,15;

2page

select * from table_name where ~~~~ order by DueDate limit 15,15;

각 페이지에 대해 15개씩 끊어서 보여주는 쿼리이며, mysql의 limit를 이용하는중인데,

문제는 1페이지에 나왔던 레코드가 2페이지에 또 나오는 현상이 발생합니다.(wherelimit 조건을 제외하면 1건이 확실합니다.)

order by에 걸리는 DueDate 필드가 PK나 인덱스같은 유일성을 가진 필드가 아니라서 이런 현상이 발생한다고 생각하여

order by DueDate, tableid 로 PK도 같이 조건절에 주었는데 이렇게 수정했을경우 정상입니다.

유일성을 가지지 않은 필드가 order by 조건에 걸릴 경우 이런 문제가 발생하나요?

1 답변

  • 유일성을 가지지 않아서 발생한 문제라기 보다는 DueDate가 같은 값이 여러개 있어서 발생하는 문제인것 같습니다.

    예를들어 어떤 조건(where)를 통해 셀렉션(selection)된 결과가 다음과 같고, 이를 10개씩 페이지를 나눈다고 할 때,

    ID DueDate
    1 2016-09-01
    2 2016-09-02
    3 2016-09-03
    4 2016-09-04
    5 2016-09-05
    6 2016-09-06
    7 2016-09-07
    8 2016-09-08
    9 2016-09-08
    10 2016-09-08
    11 2016-09-08
    12 2016-09-08
    13 2016-09-09
    14 2016-09-10
    15 2016-09-11
    16 2016-09-12
    17 2016-09-12
    18 2016-09-12
    19 2016-09-13
    20 2016-09-14

    첫 페이지는 1~7이 활실히 포함될 것이나, 8~12중에 먼저 정렬되는 3개가 포함될 것 입니다. 그리고 그 다음에 페이지의 경우, 8~12중 3개를 제외한 2개와 13~20개 목록에 나타나게 될텐데, 이때 8~12의 순서를 결정하는 하위 정렬 기준이 없는 경우, 경우에 따라 중복되어서 나타날 수 있습니다.

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)