source

Mariadb: OFFSET 및 LIMIT를 사용하는 페이지가 한 행을 건너뜁니다.

nicesource 2023. 6. 28. 21:47
반응형

Mariadb: OFFSET 및 LIMIT를 사용하는 페이지가 한 행을 건너뜁니다.

MariaDB 테이블이 있습니다.

id, 이름

id 열에는 Primary, auto_increment, unique 속성이 있습니다.

테이블에는 40,000개의 행이 있습니다.

저는 이 PHP와 MariaDB를 사용하여 이 테이블에서 행을 로드하고 있습니다.다음은 PHP 코드입니다.

$get_rows = $conn->prepare("SELECT * FROM my_table where id> 0 ORDER BY id ASC LIMIT 30 OFFSET ?");
$get_rows->bind_param('i', $offset);
//etc.

처음에는 쿼리가 모든 것을 올바르게 반환했지만, 다음 쿼리(AJAX를 통해 작성)에서는 현재 결과와 다음 결과 사이에 한 행 간격이 있는 다음 30개 행을 받았습니다.그리고 이것은 계속됩니다.

표에서 #1 행이 삭제되었습니다.그래서 복원을 했는데 이제 쿼리가 작동합니다.하지만 앞으로 더 많은 행을 삭제해야 합니다. (소프트 삭제 옵션이 없습니다.)행을 계속 삭제하고 해당 쿼리가 올바른 결과를 반환하도록(행을 건너뛰지 않고) 할 수 있는 방법이 있습니까?

편집

다음은 처음 2개의 쿼리에 있는 ID 범위의 예입니다.

쿼리 1:

247--276

질문 2:

278--307

(277 누락)

NB 채팅GPT에 문의했지만 도움이 되지 않았습니다 :)

LIMIT 및 OFFSET 행을 값이 아닌 위치별로 쿼리합니다.따라서 첫 번째 "페이지"에서 행을 삭제한 경우, 이후의 모든 행의 위치가 하나씩 아래로 이동합니다.

행을 놓치지 않도록 하는 한 가지 솔루션은 페이지를 최대로 정의하는 것입니다.id값은 오프셋 대신 앞 페이지의 값은 오프셋으로 표시되지 않습니다.

$get_rows = $conn->prepare("
  SELECT * FROM my_table where id> ? 
  ORDER BY id ASC LIMIT 30");
$get_rows->bind_param('i', $lastId);

이전 쿼리가 이전 페이지를 본 경우에만 작동하므로 해당 페이지의 마지막 ID 값을 저장할 수 있습니다.

언급URL : https://stackoverflow.com/questions/75501058/mariadb-pagination-using-offset-and-limit-is-skipping-one-row

반응형