2010-12-08 11 views
4

Ich möchte ein Paging-Skript im Grunde funktioniert, aber die Situation ist ein bisschen komplex. Ich muss Daten aus der Vereinigung von zwei SQL-Abfragen auswählen. Siehe die Abfrage unten. Ich habe ein Tischbuch und einen Tisch Buchbesuch. Was ich möchte, ist hier, um alle Bücher für eine bestimmte Kategorie in ihrer Beliebtheit anzuzeigen. Ich bekomme Daten für alle Bücher mit mindestens einem Besuch, indem ich Tischbuch und Buchbesuch beiarbeite. und dann verbinde es mit allen Büchern ohne Besuch. Alles funktioniert gut, aber wenn ich versuche, Paging zu machen, muss ich es begrenzen wie (0,10) (10,10) (20,10) (30,10), richtig? Wenn ich 9 Bücher in einem Buchbesuch für diese Kategorie und 3761 Bücher ohne Besuch für diese Kategorie (insgesamt 3770 Bücher) habe, sollte es 377 Seiten, 10 Bücher auf jeder Seite auflisten. aber es zeigt keine Daten für einige Seiten, weil es versucht, Bücher mit Limit 3760,10 und somit keine Datensätze für die zweite Abfrage in Union zu zeigen. Vielleicht kann ich die Situation hier nicht klären, aber wenn Sie ein wenig über die Situation nachdenken, werden Sie meinen Standpunkt verstehen.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 

Antwort

2

Verwenden Sie kein Limit für die separaten Abfragen. Verwenden Sie das Limit nur am Ende. Sie wollen das Loch ergeben sich aus den 2 Abfragen gesetzt bekommen und zeigen dann nur die 10 Ergebnisse, die Sie benötigen, egal ob diese LIMIT 0, 10 oder 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

nein, es 10.000 Ergebnisse zeigen, kann so muss Limit verwenden –

+0

Youy zeigen alle Buch mit Besuche von allen Büchern ohne Besuch in einer bestimmten Kategorie gefolgt, oder? Sie brauchen also LIMIT in den Unterabfragen der UNION nicht. Sie müssen nur das Ergebnis entsprechend der Seitennummerierung LIMITIEREN. Ihre Abfrage sollte in etwa so aussehen (SELECT all_books_with_ visits) UNION (SELECT all_books_with_no_visit) LIMIT 3760,10. Das letzte LIMIT sollte das einzige in Ihrer Abfrage sein. Im Moment haben Sie 2 zusätzliche LIMITs in jeder Unterabfrage, die das Problem verursachen. –

+1

Ich habe das gleiche Problem mit Seitenumbruch durch MySQL. @Yasen Zhelev deine Lösung funktioniert, aber als g.b. bereits gesagt, wenn die Unterabfragen 10.000 Ergebnisse zurückgeben, würde dies nicht die Leistung zu begrenzen, nur nach der Vereinigung zu begrenzen? – mvdb