before 시점에서 아래와 같이 sort_index를 변경했는데, 1 페이지의 끝 부분 쯤에 나온 게시물이 2 페이지의 앞 부분에서 또 다시 출력되는 문제가 있습니다.
$obj->sort_index = '(documents.voted_count + documents.blamed_count)'; $obj->order_type = 'desc';
document.getDocumentList 트리거가 등록된 다른 모듈은 슈퍼캐시 모듈, 타임라인 플러스 모듈 그리고 자체 제작한 또 다른 모듈입니다.
(상황 상 자체적으로 제작한 모듈의 전체 코드를 공개하기는 어렵습니다.)
위의 트리거 코드를 제외하였더니 중복되지 않고 정상적으로 게시글 목록을 가져옵니다.
(+ 연산 없이, 단일 칼럼으로만 정렬한 경우에도 정상적입니다.)
추측해볼만한 원인이 있을까요?
(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
이런 결과가 나와서, 추천수가 같은 글들이라도 항상 일정한 순서로 정렬됩니다.