Requête SQL toute bête...
J'ai rencontré un problème récemment en faisant une requête vraiment toute bête. Le pire c'est que ce n'est pas vraiment la première fois que cela m'arrive, et je n'arrive pas à y remédier.
Voici le problème :
Je dispose d'une table 'news' avec 100 enregistrements. Je veux réaliser du multipages pour ne pas afficher 100 news par page. Je veux faire une fonction qui m'indique s'il reste des news à afficher. Logiquement je me dis : Il suffit de compter le nombre de news qu'il reste à partir de la page ou je suis.
J'affiche 7 news par pages, il y a donc 100 / 7 pages, soit 15 pages (14 pleines et 2 news sur la dernière).
7 news par pages.
Page en cours = 14
Le limit à appliquer en SQL est donc : 14 * 7 = 98
Requête : SELECT COUNT(id) FROM news LIMIT 98, 7
Logiquement MySQL doit ramener un seul résultat : 2. Hors il n'en renvoi aucun. J'essaye avec :
SELECT COUNT(id) FROM news GROUP BY id LIMIT 98, 7
Et cette fois MySQL ramène 2 résultats : 2 lignes qui contiennent 1. J'avoue que je n'y comprends rien, et la seule alternative que j'ai trouvé est donc d'utiliser cette dernière requête puis de faire un mysql_num_rows()
derrière... Pas forcément l'optimum.
Si vous voyez une explication / solution je suis preneur.
Commentaires
Et puis avec un système de pagination bien fait tu as juste besoin du nombre total et du nombre par page et ça marcherait tout seul, tu veux une super fonction qui fait ça ?
Hello
Le LIMIT ne s'applique pas au COUNT qui renvoie une seule ligne dans ton cas.
Donc en fait tu essayais d'obtenir 7 lignes à partir de la 98 ème alors qu'il n'y en avait qu'une.
Nous on fait un count(*) suivi d'une limit n,n à chaque page.
Si tu veux je mettrai une fonction de pagination en ligne sur mon blog
Les fonctions ne sont pas un problème, je voulais juste essayer un truc tout con mais qui ne marche pas. Je veux bien que le LIMIT ne s'applique pas au COUNT, mais il fallait que je le sache... Je trouvais logique de le faire moi...
Julien -> (ah non merde, c'est Julien tout les deux), Julien Pellegrain : En fait je voulais faire ça en SQL pour pas avoir à m'emmerder à le faire en PHP, c'est vrai que c'est 3 fois rien, mais en ce moment j'aime bien me faire chier en SQL ^^.
Julien Tartarin : Idem en fait, ici j'essayais ça suivant cette logique : sélectionner les dernier enregistrements et les compter, et suivant ma logique le limit devait s'effectuer puis le count. Et j'essayais d'obtenir 7 lignes alors qu'il y en as que 2 plutot .
ouais, c'est vrai, mais je pense que ta matrice de phase est un peu obsolète. Que dirais-tu d'une omelette à la bière?
J'aurais pas dit mieux.
Mais je pense, enfin je crois, que tu devrais cracker le code au niveau du noyau intrasensoriel de la machine. Mais une omelette aux girolles avec une bière c'est pas mal non plus.
Perso je trouve ca un peu trop d'utiliser
> list($nb_news)=mysql_fetch_row($query);
pour un seul element, pourquoi ne pas utiliser current() ?
Je vois pas ce qu'il y a de trop à utiliser le list.
list($nb_news) = mysql_fetch_row($query);
et
$nb_news = current(mysql_fetch_row($query));
C'est pareil pour moi.. En plus avec le current il faut faire gaffe au pointeur, alors qu'avec list pas besoin de s'embêter..
Bon ok la c'est un résultat unique, mais même du point de vue de la syntaxe je préfère le list. en plus il permet de récupérer plus d'un champ donc..
C'est justement parce qu'il permet de recuperer plus d'un champ que je prefere l'utiliser ben... quand il faut recuperer plus d'un champ
Sachant que la c'est sur à 100% que mysql_fetch_row() te retournera un seul resultat.
J'aime bien que mon code soit clair et ait un sens donc je pars du principe que list() sert à "lister" ^^ je l'utilise donc quand il y a plusieurs champ à recuperer (exemple tout con : getimagesize() )
Apres c'est sur que list() ca marche donc bon c'est une question de point de vue et d'habitude de programmation =)
Laissez le vôtre !
Les commentaires pour ce billet sont fermés.
oh le boulet...
count(id) te retournera toujours le nombre d'id sans tenir compte des limites
Il faut que tu fasses :
$query=mysql_query("SELECT COUNT(id) FROM news");
list($nb_news)=mysql_fetch_row($query);
Pour connaitre le nombre restant :
$nombre_restant=$nb_news-(14*7);
Trop trop dur, wake up guy !!