2010-12-08 58 views
4

Je veux un script de pagination qui fonctionne correctement, mais la situation est un peu complexe. J'ai besoin de choisir des données de l'union de deux requêtes sql. Voir la requête ci-dessous. J'ai un livre de table et une table bookvisit. Ce que je veux est ici pour montrer tous les livres pour une catégorie particulière dans leur ordre de popularité. Je reçois des données pour tous les livres avec au moins une visite en rejoignant le livre de table et la revue de livres. puis l'union avec tous les livres sans visite. Tout fonctionne bien mais quand j'essaye de faire la pagination, j'ai besoin de la limiter comme (0,10) (10,10) (20,10) (30,10), correct? Si j'ai 9 livres dans bookvisit pour cette catégorie et 3761 livres sans aucune visite pour cette catégorie (total de 3770 livres), il devrait énumérer 377 pages, 10 livres sur chaque page. mais il ne montre aucune donnée pour certaines pages parce qu'il essaie de montrer des livres avec la limite 3760,10 et par conséquent pas d'enregistrements pour la deuxième requête en union. Peut-être que je suis incapable de clarifier la situation ici, mais si vous pensez un peu à la situation, vous comprendrez ce que je veux dire.problème de limite d'union 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 

Répondre

2

N'utilisez pas de limite pour les requêtes séparées. Utilisez la limite seulement à la fin. Vous voulez obtenir le résultat du trou fixé des 2 requêtes et afficher uniquement les 10 résultats que vous avez besoin, peu importe si ce LIMIT 0, 10 ou 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

non, il peut afficher 10.000 résultats afin devra utiliser la limite –

+0

Youy montrent tout livre avec des visites suivies par tous les livres sans aucune visite dans certaine catégorie, non? Vous n'avez donc pas besoin d'avoir LIMIT dans les sous-requêtes de l'UNION. Vous avez juste besoin de LIMITER le résultat en fonction de la pagination. Votre requête devrait ressembler à ceci (SELECT all_books_with_visits) UNION (SELECT all_books_with_no_visit) LIMITE 3760,10. La dernière LIMIT devrait être la seule dans votre requête. À l'heure actuelle, vous avez 2 LIMIT supplémentaires dans chaque sous-requête qui causent le problème. –

+1

J'ai le même problème avec la pagination à travers MySQL. @Yasen Zhelev votre solution fonctionne, mais comme g.b. déjà dit, si les sous-requêtes vont renvoyer 10 000 résultats, cela ne diminuerait-il pas la performance à limiter seulement après l'union? – mvdb