2010-11-16 3 views
0

Je construis un site php en utilisant jquery et le plugin DataTables. Ma page est présentée comme elle doit l'être avec la pagination mais en traitant de grands ensembles de données, j'ai remarqué que le serveur tire TOUTES les lignes retournées par opposition à la limite de 10 lignes (peut être plus) indiquée dans chaque 'page'.Possible de limiter les résultats retournés, mais laisse 'pagination' à table?

Est-il possible de limiter les résultats d'une requête tout en conservant les numéros d'ID de ces résultats en mémoire, alors lorsque la page 2 est atteinte (ou le numéro de résultat est modifié), seules les nouvelles données sont recherchées?

Est-il même logique de le faire de cette façon?

Je ne veux tout simplement pas interroger une base de données avec 2000 lignes retournées, puis avoir un 'plug-in frontal' donner l'impression que les autres résultats sont cachés lorsqu'ils sont honnêtement sur la page depuis le début.

Répondre

1

La clause LIMIT dans SQL a deux parties - la limite et le décalage.

Pour obtenir les 10 premières lignes:

SELECT ... LIMIT 0,10 

Pour obtenir les 10 lignes suivantes:

SELECT ... LIMIT 10,10 

Pour obtenir les 10 lignes suivantes:

SELECT ... LIMIT 20,10 

Tant que vous COMMANDEZ le résultat définissez la même chose à chaque fois, vous n'avez absolument pas à (et ne voulez pas) d'abord demander à la base de données de vous envoyer toutes les 2000 lignes.

Pour afficher la pagination en même temps, vous devez toujours connaître le nombre total de lignes correspondant à votre requête. Il y a deux façons de gérer que -

1) Demander un nombre de lignes avec une requête séparée

SELECT COUNT(*) FROM table WHERE ... 

2) Utilisez les SQL_CALC_FOUND_ROWS allusion dans votre requête, qui dira MySQL pour calculer le nombre de lignes correspondre à la requête avant de ne renvoyer que les 10 que vous avez demandés. Vous émettez ensuite une requête SELECT FOUND_ROWS() pour obtenir ce résultat.

SELECT SQL_CALC_FOUND_ROWS column1, column2 ... LIMIT 0,10 

2 est préférable car il n'ajoute pas de requête supplémentaire à chaque chargement de page.

+0

Je ne suis pas du tout d'accord. D'après mon expérience de la mise en œuvre dans un certain nombre de sites, l'option 1 pour obtenir le nombre total est en fait préférable. L'utilisation de 'SQL_CALC_FOUND_ROWS' chatouille une variété de bogues et de bizarreries MySQL, y compris la destruction de tout gain de performance de la clause' LIMIT'. – staticsan

+0

Merci pour votre aide tout d'abord. Je connais bien la clause LIMIT, mais le problème avec lequel je me bats est de savoir comment conserver ces enregistrements individuels dans les variables de données, surtout sans nécessiter de chargement de page supplémentaire. Le plugin DataTables a des exemples côté serveur, mais ils semblent être si vieux et utilisent des appels sql plus anciens, il est presque plus frustrant de les chiffrer (sans parler des problèmes avec les formats datetime et les réponses json). On dirait que je vais devoir expérimenter un peu. – JM4

+0

Vous avez deux options de base. Tirez-les tous avec une requête, ou seulement quelques-uns avec une limite. Mais vous pouvez utiliser les outils AJAX de jQuery et écrire un script latéral sur le serveur qui vous permet d'extraire plus de données au besoin afin de ne pas avoir à recharger la page. C'est ainsi que mon script fonctionne habituellement. – gokujou

Questions connexes