Je suis confronté à un problème bateau. Je dois concevoir un moteur de recherche sur mon site, qui utilise MySQL de façon trés classique. Je génère une bête requête de type SELECT qui me retourne des résultats.
Le souci, c’est que d’un côté, je ne veux sélectionner qu’une fraction de ces résultats pour afficher une pagination. J’utilise la trés classique clause LIMITE. D’un autre côté, je veux retourner le nombre total de réponses correspondants à la recherche, comme le fait n’importe quel moteur de recherche digne de ce nom.
Je peux le faire avec deux requêtes :
Ça marche, mais c’est moche[1]. Voici la bonne méthode :
SELECT SQL_CALC_FOUND_ROWS * FROM table WHERE ... LIMIT 20 SELECT FOUND_ROWS()
Simple et efficace. Merci MySQL.
Notes :
- pas glop [retour]
2 Commentaires
Bon allez, c’est décidé, j’ajoute ce blog à mes abonnements ! Merci bien !
Oui ton idée part d’un bon sentiment, mais le problème est qu’actuellement il y a un bug de type race condition sur la fonction SQL_CALC_FOUND_ROWS.
admettons que tu aies 2 requetes à executer. Un listing client et un listing produits, chacun avec une clause différente.
tu lances ton 1er SQL_CLAC_FOUND_ROWS sur la table clients. Puis avant d’appeler le FOUND_ROWS tu as une requete executée sur la table produits. Le FOUND_ROWS va te retourner le nombre total de produits et non de clients comme le résultat attendu.
Temps que cette race condition n’est pas résolue, je déconseille cette utilisation.
@++