[mysql] diviser en plusieurs pages les résultats - Avec une seule requête, si possible :)

voilà je fais un petit moteur de recherche pour une application, nouvelle source de découvertes pour moi ^^

Alors ca fait un truc genre : SELECT … FROM XX WHERE YY LIKE ‘%search%’

Or je voudrais bien faire du multi pages, comme sur le forum en fait, et donc il faut que je rajoute un LIMIT 15 à ma requête non ?

Mais du coup comment compter le nombre de résultats pour générer mes liens vers les autres pages ? Mysql_num_rows ne retourne que les résultats de la requête, LIMIT incluse :confused:

Faut-il fait une seconde requête ? Qu’est ce qui serait le plus performant ?

Merci par avance

http://dev.mysql.com/doc/mysql/en/select.html -> LIMIT X OFFSET Y

(la syntaxe de pgsql est préférer, au moins ça t’évite de réécrire du code)

Ce que tu fais (© avis perso) :

  1. tu prend toutes tes données en ne prenant que les identifiants et en simplifiant le SELECT, donc en gros un (select recherche) LIMIT 1000 (pour ne pas bouffer trop de mémoire, c’est toi qui vois ensuite)

Ex:

$id = array();
$q = mysql_query( 'SELECT id FROM X WHERE Y LIKE '%z%' LIMIT 1000' );
while ( $r = mysql_fetch_row($q) )
  $id[] = $r[0];
  1. forcément, tu as le nombre total de données (count($id)), c’est cool

  2. tu corrige ton LIMIT en prenant les index 0 à 0 + données par page, tu fais un IN ex:

$offset_max = $offset + $row_per_page;
$s = '';
for ( $i = $offset; $i < $offset_max; $i++ )
  $s .= ($s == '' ? '':','). $id[$i];

$q = mysql_query( 'SELECT ... FROM ... WHERE id IN(' . $s . ')' );
...

Et pour ta recherche, c’est plus simple :slight_smile: tu fais une table spéciale pour ça, avec deux champs : search_id, search_result

Tu stockes dans search_result tous les identifiants que tu as récupéré, et tu évite de rechercher à chaque changement de page.

Dans les grandes lignes, c’est exactement le fonctionnement du module de recherche de phpbb.

Merci de ta réponse, va me falloir du temps pour comprendre ce que t’expliques mais bon… :smiley:

Ben c’est simple :

  1. tu prend juste tout les résultats de la recherche
  2. tu stockes dans une table ces résultats pour une réutilisation ultérieure (en n’oubliant pas de stocker les paramètres de la recherche, c’est bête mais important)
  3. tu affiche ces résultats

Non c’est pas simple, mais bon c pas grave :smiley:

J’essaie de trouver une méthode que j’arrive à comprendre ^^

JE fais ma requête normalement, je compte le nombre de résultats et je les affiches via une boucle for(). je change l’amplitude de mon for selon le nombre de résultats… si <10 (le nombre de résultats à afficher) alors limite du for = nombre résultats, sinon c 10.

Maintenant faut générer les liens pour afficher tout ce merdier… comme je vais ramer encore ^^ Je vais faire ca avec une autre requête je pense : passer le nombre de résultats et l’offset via GET et refaire l’affichage sur cette basse…

Probablement pas très propre ni efficace remarque, au moins je comprend (presque) ce que je fais :smiley:

1- SELECT COUNT(id) FROM ta_table
2- SELECT * FROM ta_table LIMIT debut, nbr_resultat

Comme le dit Dalai : tu peux aussi remplacer la requête de sélection par un COUNT.

Si tu veux ma méthode est très bien quand tu as beaucoup de données: tu ne reprend pas une recherche à zéro, elle est déjà faites: tu la recharge.