Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Requête avec LIMIT et nombre de résultats

8 réponses
Avatar
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

8 réponses

Avatar
Thibault
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();
Avatar
Xavier Nayrac
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
Avatar
Dominique Ottello
Xavier Nayrac écrivait :

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
Avatar
Alain Montfranc
Dominique Ottello a écrit
Xavier Nayrac écrivait :

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)
Avatar
Dominique Ottello
Xavier Nayrac écrivait :

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.
Avatar
Alain Montfranc
Dominique Ottello a écrit
Xavier Nayrac écrivait :

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.



Un truc archi-crad du style :

select l.isbn, c.count
from livres l,
(select count(*) from livres where auteur like 'C%') as c
where auteur like 'C%'
limit 10;
Avatar
Xavier Nayrac
Dominique Ottello a écrit :
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.



Si ,si. Il se trouve simplement qu'ici c'est la même chose. J'ai
simplifié la requête en retirant les clauses where et order pour que tu
vois mieux le "truc" du select imbriqué. Mais apparement j'ai loupé mon
coups :)
Il faut que tu adaptes à tes besoins.

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.



Voir la réponse d'Alain Montfranc.

--
Xavier Nayrac
Avatar
Dominique Ottello
Alain Montfranc écrivait :

Un truc archi-crad du style :

select l.isbn, c.count
from livres l,
(select count(*) from livres where auteur like 'C%') as c
where auteur like 'C%'
limit 10;



C'est vrai que c'est « crad », mais ça fonctionne :

SELECT A.a_nom, A.a_prenom, A.a_promo, P.p_rep, C.total
FROM avia_vilg_apprentis AS A
INNER JOIN (SELECT COUNT(*) AS total FROM avia_vilg_apprentis
WHERE a_nom REGEXP '.*RT.*') AS C
INNER JOIN avia_vilg_promotions AS P
ON A.a_promo = P.p_nom
WHERE A.a_nom REGEXP '.*RT.*'
ORDER BY A.a_nom, A.a_prenom LIMIT 20

Finalement, je pense effectuer une première requête pour connaître juste
le nombre de résultats, ce sera plus propre :

SELECT count(*)
FROM avia_vilg_apprentis AS A
WHERE A.a_nom REGEXP '.*RT.*'

Puis ensuite, selon le résultat de la première requête, une boucle pour
obtenir lesdits résultats.

Merci à tous ceux qui m'ont répondu.
--
Ce n'est pas parce que l'erreur se propage qu'elle devient vérité. Gandhi
Technologie aéronautique : http://aviatechno.free.fr (http://ottello.net)
Concorde dans la presse de 1965 à 2003 : http://le.pointu.free.fr