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
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
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();
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
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
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
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 ?
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
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
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
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
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)
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)
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
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.
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;
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
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.
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
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
Alain Montfranc <x@x.con> é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
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