2014-08-28 2 views
2

LIMIT 및 OFFSET을 사용하여 모든 mysql 쿼리를 자동으로 페이지 매김하는 시스템이 있습니다.mysql 쿼리로 페이지 매김

예 :

// Page 1 
SELECT * FROM tbl_products WHERE category_id = 1 LIMIT 20 OFFSET 0 

// Page 2 
SELECT * FROM tbl_products WHERE category_id = 1 LIMIT 20 OFFSET 20 

// Page 3 
SELECT * FROM tbl_products WHERE category_id = 1 LIMIT 20 OFFSET 40 

etc. 

지금 질문 자체.

A) 가장 좋은 방법인가요? 대안이 있습니까?

B) 제품 페이지 (products.php? id = 12345)에 도착하면 같은 페이지에 제품 목록이 표시됩니다. 어떻게 제품 목록에서 올바른 페이지를 선택할 수 있습니까? 이 제품이 제품 목록의 105 번째 페이지에있는 경우?

목록에서 "선택한 제품"을 강조 표시합니다. 이제는 제품이 첫 페이지에있을 경우에만 작동합니다. 첫 페이지는 항상 자동으로 products.php 페이지에로드됩니다. 예를 들어

+1

우선,'limit' 절이 있다면 항상'order by' 절을 포함시켜야합니다. 그렇지 않으면 페이지가 일치하지 않습니다. – bpgergo

+0

글쎄, 여기이 모든 의사는 내가 건너 뛴 이래로. id에 따라 또는 기본적으로 시간순으로 정렬되므로 일관성이 유지됩니다. – unska

답변

0

귀하의 첫 번째 페이지는

off = (page - 1)*20 ; 
row = 20; 
select * from table limit (off, row); 

이 최적의이 같은 것을 사용하는 것이 www.tst.com?page=1 URL에 GET 변수가있는 경우. 코드는 두 개의 쿼리보다 훨씬 빠릅니다. 테이블에서 개수를 계산 한 다음 테이블의 n 행에 대한 잠재력으로 인해 해당 개수 결과를 새 매개 변수로 사용해야합니다. 테이블이 클수록 효율적인 쿼리가 될 것입니다.

1

A) 가장 좋은 방법인가요? 어떤 대안이 있습니까?

페이지 매김이 서버에 의해 수행되고 원하는 행만 반환되는 가장 좋은 방법 일 수 있습니다.

B) [...] 나는 제품 목록에 올바른 페이지 [...] 나는이 두 가지 가능한 솔루션의

를 생각할 수있는 선택 방법 :


SELECT id 
FROM tbl_products 
WHERE category_id = 1 
ORDER BY id 

참고 ORDER BY clau : 당신의 상세 페이지는 모든 ID를 선택하는 쿼리를 사용하여 se ... 두 쿼리 (LIMIT이있는 쿼리와 모든 ID를 선택하는 쿼리)는 똑같은 순서로 정렬해야합니다. 그런 다음 PHP 코드를 사용하여 모든 행을 반복하고 제품 ID가있는 인덱스를 찾을 수 있습니다. 그런 다음이 숫자를 페이지 크기로 나누어 페이지 번호를 결정하십시오.


대체 솔루션은 MySQL의 쿼리 자체에입니다 같은 번호의 행을 다음

SELECT @row_number := @row_number + 1 AS row_number, id 
FROM tbl_products, (SELECT @row_number := 0) AS temp1 
WHERE category_id = 1 
ORDER BY id 

둥지 특정 ID의 행 번호를 결정하는 또 다른 질의 안쪽이 쿼리 :

SELECT row_number FROM (
    SELECT @row_number := @row_number + 1 AS row_number, id 
    FROM tbl_products, (SELECT @row_number := 0) AS temp1 
    WHERE category_id = 1 
    ORDER BY id 
) AS temp2 WHERE id = 1234 

행 번호를 페이지 크기로 나누어 페이지 번호를 가져옵니다.

+0

첫 번째 일은 거의 내가하고있는 일이지만 올바른 페이지 번호를 알아 내기 위해 페이지를로드 할 때마다 전체 테이블 스캔을 수행하는 것은 끔찍한 생각처럼 보입니다. :/ – unska

+0

ID 만 선택하면 데이터베이스에서 색인을 사용할 수 있어야합니다. –