2010-12-08 18 views
4

기본적으로 페이징 스크립트가 제대로 작동하기를 원하지만 상황이 조금 복잡합니다. 두 SQL 쿼리의 조합에서 데이터를 선택해야합니다. 아래 쿼리를 참조하십시오. 나는 테이블 책과 탁자 책을 가지고있다. 내가 원하는 것은 특정 카테고리의 모든 도서를 인기 순서대로 표시하는 것입니다. 나는 적어도 한 번 방문하여 모든 책에 대한 데이터를 테이블 북과 bookvisit에 가입시키고 있습니다. 그런 다음 방문하지 않고 모든 책과 연합하십시오. 모든 것이 잘 작동하지만 페이징을 시도 할 때 (0,10) (10,10) (20,10) (30,10)과 같이 제한해야합니다. 해당 범주의 방문 도서가없는 경우 해당 범주의 책을 9 권, 3761 권의 책을 3761 권 (3770 권의 책)이 있으면 377 페이지, 각 페이지 당 10 권의 책을 나열해야합니다. 한 페이지에 제한이없는 책을 보여주기 때문에 일부 페이지에는 데이터가 표시되지 않으므로 union에 두 번째 쿼리에 대한 레코드가 없습니다. 나는이 상황을 해결할 수 없을지 모르지만 상황에 대해 조금 생각하면 내 요점을 얻을 것이다.mysql union limit problem

SELECT * FROM ( 
SELECT * FROM (
SELECT viewcount, b.isbn, booktitle, stock_status, price, description FROM book AS b 
INNER JOIN bookvisit AS bv ON b.isbn = bv.isbn WHERE b.price <> 0 AND hcategoryid = '25' 
ORDER BY viewcount DESC 
LIMIT 10, 10 
) AS t1 
UNION 
SELECT * FROM 
( 
SELECT viewcount, b.isbn, booktitle, stock_status, price, description FROM book AS b 
LEFT JOIN bookvisit AS bv ON b.isbn = bv.isbn WHERE b.price <> 0 AND hcategoryid = '25' 
AND viewcount IS NULL 
ORDER BY viewcount DESC 
LIMIT 10, 10 
) AS t2 
) 
    AS qry 
    ORDER BY viewcount DESC 
LIMIT 10 

답변

2

별도의 쿼리에는 한도를 사용하지 마십시오. 제한은 끝에서만 사용하십시오. 당신은이 LIMIT 0, 10 LIMIT 3760,10

SELECT * FROM ( 
SELECT * FROM ( 
    SELECT viewcount, b.isbn, booktitle, stock_status, price, description FROM book AS b 
    INNER JOIN bookvisit AS bv ON b.isbn = bv.isbn WHERE b.price <> 0 AND hcategoryid = '25' 
    ORDER BY viewcount DESC 
) AS t1 
UNION 
SELECT * FROM 
( 
    SELECT viewcount, b.isbn, booktitle, stock_status, price, description FROM book AS b 
    LEFT JOIN bookvisit AS bv ON b.isbn = bv.isbn WHERE b.price <> 0 AND hcategoryid = '25' 
    AND viewcount IS NULL 
    ORDER BY viewcount DESC 
) AS t2 
) 
AS qry 
ORDER BY viewcount DESC 
LIMIT 10, 10 
+0

아니, 그렇게 만 개 결과를 표시 할 수 있습니다 경우 당신이 상관없이 필요에만 10 개 개의 결과를 표시 한 후 2 개 쿼리에서 설정 한 구멍 결과를 얻을 싶어 제한을 사용해야합니다 –

+0

Youy는 특정 카테고리에 방문하지 않고 모든 도서 옆에 방문한 모든 도서를 표시하고 있습니까? 따라서 UNION의 하위 쿼리에서 LIMIT을 가질 필요는 없습니다. 페이지 매김에 따라 resultl을 제한하면됩니다. 검색어는 (SELECT all_books_with_visits) UNION (SELECT all_books_with_no_visit) LIMIT 3760,10과 같아야합니다. 마지막 LIMIT는 검색어의 유일한 LIMIT 여야합니다. 지금은 문제를 일으키는 각 하위 쿼리에 2 개의 추가 LIMIT가 있습니다. –

+1

MySQL을 통한 페이지 매김과 동일한 문제가 있습니다. @ Yasen Zhelev 솔루션이 작동하지만 g.b. 이미 하위 쿼리가 10,000 개의 결과를 반환하면 결합 이후에만 성능이 저하되지 않을 것이라고 이미 말했습니까? – mvdb