GNT sans publicité, site mobile, fonctionnalitées exclusives...

Requête avec LIMIT et nombre de résultats

Le
Dominique Ottello
Bonjour,

Une requête MySQL sur des tables MyISAM me donne 117 résultats.

Je voudrait ajouter une limite du nombre de résultats retournés tout en
connaissant le nombre total.

Si je fais :
SELECT A.a_nom, A.a_prenom, A.a_promo
FROM avia_vilg_apprentis AS A
WHERE A.a_nom REGEXP '.*RT.*'
ORDER BY A.a_nom, A.a_prenom LIMIT 20

J'ai bien les 20 premiers résultats

Si je fais :
SELECT A.a_nom, A.a_prenom, A.a_promo, COUNT(*)
FROM avia_vilg_apprentis AS A
WHERE A.a_nom REGEXP '.*RT.*'
ORDER BY A.a_nom, A.a_prenom LIMIT 20

Count me donne bien 117, mais je n'ai qu'une seule ligne en résultat.

Comment combiner COUNT(*) et LIMIT 20 pour n'obtenir que les 20 premiers
ET le nombre total ?

D'abord, est-ce possible avec une seule requête ?

Merci.

--
Un ordinateur résout des problèmes que nous n'aurions pas sans lui
Technique aéronautique : http://aviatechno.free.fr
Concorde dans la presse de 1965 à 2003 : http://le.pointu.free.fr
Lire les 8 réponses

Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses Page 1 / 2
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Thibault
Le #21916241
On Thu, 07 May 2009 18:33:52 +0200, Dominique Ottello wrote:
Bonjour,



Bonjour,

Comment combiner COUNT(*) et LIMIT 20 pour n'obtenir que les 20 premiers
ET le nombre total ?

D'abord, est-ce possible avec une seule requête ?



Je ne sais pas le faire avec une seule requête mais, en tout cas
avec MySQL, on peut utiliser SQL_CALC_FOUND_ROWS :

SELECT SQL_CALC_FOUND_ROWS A.a_nom, A.a_prenom, A.a_promo
FROM avia_vilg_apprentis AS A
WHERE A.a_nom REGEXP '.*RT.*'
ORDER BY A.a_nom, A.a_prenom LIMIT 20

puis :

SELECT FOUND_ROWS();
Xavier Nayrac
Le #21916231
Bonsoir,

Dominique Ottello a écrit :
Je voudrait ajouter une limite du nombre de résultats retournés tout en
connaissant le nombre total.

Si je fais :
SELECT A.a_nom, A.a_prenom, A.a_promo
FROM avia_vilg_apprentis AS A
WHERE A.a_nom REGEXP '.*RT.*'
ORDER BY A.a_nom, A.a_prenom LIMIT 20

J'ai bien les 20 premiers résultats

Si je fais :
SELECT A.a_nom, A.a_prenom, A.a_promo, COUNT(*)
FROM avia_vilg_apprentis AS A
WHERE A.a_nom REGEXP '.*RT.*'
ORDER BY A.a_nom, A.a_prenom LIMIT 20

Count me donne bien 117, mais je n'ai qu'une seule ligne en résultat.



C'est le comportement voulu de count.

Comment combiner COUNT(*) et LIMIT 20 pour n'obtenir que les 20 premiers
ET le nombre total ?



Tu cherches à ajouter le total à chaque lignes, c'est bien ça ?
Dans ce cas, on peut faire de cette façon :

select a, (select count(*) from matable)
from matable limit 20;

Il y a peut-être d'autres solutions...

D'abord, est-ce possible avec une seule requête ?



J'ai une autre question : pourquoi pas 2 requêtes ?

--
Xavier Nayrac
Dominique Ottello
Le #21916221
Xavier Nayrac
J'ai une autre question : pourquoi pas 2 requêtes ?



Parce que je voudrais savoir, dès la première requête, s'il va falloir
réitérer pour, éventuellement, demander l'affichage de la suite des
résultats.
--
Un ordinateur résout des problèmes que nous n'aurions pas sans lui
Technique aéronautique : http://aviatechno.free.fr
Concorde dans la presse de 1965 à 2003 : http://le.pointu.free.fr
Alain Montfranc
Le #21916211
Dominique Ottello a écrit
Xavier Nayrac
J'ai une autre question : pourquoi pas 2 requêtes ?



Parce que je voudrais savoir, dès la première requête, s'il va falloir
réitérer pour, éventuellement, demander l'affichage de la suite des
résultats.



Deux solutions :
- si vous voulez en afficher n et savoir si il y en a au moins un de
plus à afficher (page suivante), demandez en un de plus. Si vous en
recevez n ou moins, pas de page suivante, si vous en recevez n+1, il y
a au moins une page suivante
- utiliser un curseur http://en.wikipedia.org/wiki/Cursor_(databases)
Dominique Ottello
Le #21916201
Xavier Nayrac
Tu cherches à ajouter le total à chaque lignes, c'est bien ça ?
Dans ce cas, on peut faire de cette façon :

select a, (select count(*) from matable)
from matable limit 20;



Merci, mais ça me donne le nombre total de lignes dans la table, pas le
nombre total de résultats de la requête.

Ce que je « voudrais », c'est, avec la première requête, connaître le
nombre total de résultats, même si j'en limite le nombre restitué par
LIMIT X.
Publicité
Suivre les réponses
Poster une réponse
Anonyme