before 시점에서 아래와 같이 sort_index를 변경했는데, 1 페이지의 끝 부분 쯤에 나온 게시물이 2 페이지의 앞 부분에서 또 다시 출력되는 문제가 있습니다.

 

$obj->sort_index = '(documents.voted_count + documents.blamed_count)';
$obj->order_type = 'desc';


document.getDocumentList 트리거가 등록된 다른 모듈은 슈퍼캐시 모듈, 타임라인 플러스 모듈 그리고 자체 제작한 또 다른 모듈입니다.

(상황 상 자체적으로 제작한 모듈의 전체 코드를 공개하기는 어렵습니다.)
 

위의 트리거 코드를 제외하였더니 중복되지 않고 정상적으로 게시글 목록을 가져옵니다.
(+ 연산 없이, 단일 칼럼으로만 정렬한 경우에도 정상적입니다.)

 

추측해볼만한 원인이 있을까요?

  • profile

    (voted_count + blamed_count)는 문서마다 고유한 값을 갖는 정렬 기준이 아닙니다. 추천수와 비추천수의 합이 같은 문서가 여러 개 있을 경우, 같은 값을 가진 문서들끼리는 DB가 원하는 대로 아무렇게나 정렬합니다. 하나의 글이 어떤 때는 20번째, 어떤 때는 21번째로 정렬될 수도 있다는 뜻입니다. 1페이지에서 2페이지로 넘어가는 시점에 공교롭게도 이런 현상이 일어난다면 1페이지의 마지막 글이 2페이지의 첫 번째 글로 재등장할 수도 있지요.

     

    문서마다 고유한 값을 갖는 document_srl이나 list_order로 정렬할 때는 발생하지 않는 문제입니다. 리젠율이 아주 높은 사이트에서는 regdate도 종종 중복이 발생합니다. 1초 이내에 여러 글이 등록될 수 있으니까요.

     

    항상 일정한 정렬 순서를 유지하려면, 고유한 값을 갖는 컬럼을 정렬 기준에 추가해야 합니다.

    예를 들어

        <index var="sort_index1" order="order_type1" />

        <index var="sort_index2" order="order_type2" />

    이렇게 XML을 작성하고,

        sort_index1 = (voted_count + blamed_count)

        sort_index2 = document_srl 또는 list_order

        order_type1 = desc

        order_type2 = asc

    이렇게 쿼리하시면 (실제 조건들은 XML에 하드코딩하셔도 무방합니다)

        ORDER BY 원하시는 기준 DESC, list_order ASC

    이런 결과가 나와서, 추천수가 같은 글들이라도 항상 일정한 순서로 정렬됩니다.

  • profile profile
    감사합니다. PHP 소스 코드 상의 문제인가 싶어서 답이 안 나왔는데, 명확해진 것 같습니다.
    답변 주신 내용으로 해결해보겠습니다.