2010-12-08 20 views
4

ページングスクリプトを基本的に正しく動作させたいが状況は少し複雑です。私は2つのSQLクエリの結合からデータを選択する必要があります。以下のクエリを参照してください。私はテーブルブックとテーブルブックビスタを持っています。私が望むのは、特定のカテゴリのすべての書籍を人気順に表示することです。私はテーブルブックとブックビューに参加することで、少なくとも1回の訪問ですべての書籍のデータを取得しています。訪問していないすべての本と組み合わせてください。すべてうまく動作しますが、ページングを実行しようとすると、(0,10)(10,10)(20,10)(30,10)のように制限する必要があります。そのカテゴリのブックビューに9冊の本と3761冊の本を所蔵していない場合(合計3770冊)、各ページに377ページ、10冊のリストが表示されます。制限付き3760,10の書籍を表示しようとするため、一部のページのデータが表示されないため、2番目のクエリのレコードがユニオンに表示されません。私はここで状況をクリアすることができないかもしれませんが、状況について少し考えると、あなたは私のポイントを得るでしょう。mysql共用体の制限の問題

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

関連する問題