IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Requêtes MySQL Discussion :

Nombre de resultat d'une requete


Sujet :

Requêtes MySQL

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 13
    Points : 7
    Points
    7
    Par défaut Nombre de resultat d'une requete
    Bonjour, je cherche à gerer l'affichage de milliers d'enregistrements via des pages de 50 enregistrements(comme dans PHPmyadmin).

    Pour cela j'aimerai utiliser la clause limit dans la requete, mais j'ai besoin avant du nombre total d'enregistrement trouvé, afin de connaitre le nombre de page totale.
    Je cheche donc une commande SQL qui puisse me renvoyer le nombre de resultat d'une requete.

    Quelqu'un a une idée??

    voici ma requete pour illustrer:

    SELECT Plainte.NumeroTicket, Plainte.DateCreation, typeincident.nomtype, SegmentClient.NomSegmentClient, Service.NomService, QDF.NomQDF, Region.NomRegion, Plainte.CodePostal, localite.Localite, Constructeur.NomConstructeur, Terminaux.Modele, gestionnaire.identifiant, Plainte.MSISDN
    FROM plainte
    LEFT JOIN typeincident ON Plainte.Reftypeincident = typeincident.reftype
    LEFT JOIN service ON Plainte.RefService = Service.RefService
    LEFT JOIN segmentclient ON SegmentClient.RefSegmentClient = Plainte.RefSegmentClient
    LEFT JOIN localite ON localite.RefLocalite = Plainte.RefLocalite
    LEFT JOIN region ON Plainte.RefRegion = Region.RefRegion
    LEFT JOIN qdf ON Plainte.RefQDF = QDF.RefQDF
    LEFT JOIN constructeur ON Plainte.RefConstructeur = Constructeur.RefConstructeur
    LEFT JOIN terminaux ON Terminaux.RefTerminaux = Plainte.RefTerminaux
    LEFT JOIN gestionnaire ON gestionnaire.refgestionnaire = plainte.refgestionnaire
    WHERE plainte.numeroticket <> 'nawak'
    AND Plainte.DateCreation >= '2007-01-01'
    AND Plainte.DateCreation <= ' 2007-02-02'
    ORDER BY Plainte.DateCreation


    il n'y a pas de champs egaux, je ne peux donc pas faire de group by avec un count(*).


    Que faire?? Help

  2. #2
    Membre expérimenté
    Avatar de Adjanakis
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    739
    Détails du profil
    Informations personnelles :
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations forums :
    Inscription : Avril 2004
    Messages : 739
    Points : 1 351
    Points
    1 351
    Par défaut
    Bonjour,

    Rajouter une colonne contenant count(*) devrait fonctionner.

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 13
    Points : 7
    Points
    7
    Par défaut Pas possible avec count
    J'utilise mysql 4.1.9 et il n'est pas possible d'utiliser de count(*) sans clause group by, or je ne peux rien regrouper dans ma requete, toutes les valeures sont différentes.

    Merci pour ton aide, si t'as d'autres idées je suis preneur.

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    133
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 133
    Points : 105
    Points
    105
    Par défaut
    Citation Envoyé par Adjanakis
    Bonjour,

    Rajouter une colonne contenant count(*) devrait fonctionner.
    Il va renvoyer le total à chaque ligne ? C'est possible de combiner un count ici?
    Sinon, selon le langage que tu utilises tu as peut être une commande propre.

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 13
    Points : 7
    Points
    7
    Par défaut
    Effectivement je suis en vba, et je peux utiliser recordset.recordcount, mais ce que je cherche à faire c'est de minimiser le temps de traitement et c'est pas vraiment interessant de récuperer tous les resultats de la requete si c'est juste pour les compter. Et ensuite relancer la meme requete mais avec une clause limit.

    (j'espere que je suis assez clair)

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    133
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 133
    Points : 105
    Points
    105
    Par défaut
    Citation Envoyé par Mush
    Effectivement je suis en vba, et je peux utiliser recordset.recordcount, mais ce que je cherche à faire c'est de minimiser le temps de traitement et c'est pas vraiment interessant de récuperer tous les resultats de la requete si c'est juste pour les compter. Et ensuite relancer la meme requete mais avec une clause limit.

    (j'espere que je suis assez clair)
    D'accord mais comment veux tu connaitre le nombre total d'enregistrements si tu ne l'éxécutes pas au moins une fois entièrement (ou avec un count). Si tu fais des LIMIT successifs tu ne peux connaitre le total d'enregistrements qu'à la fin. Non?

    Sinon passes-toi du LIMIT et gère la pagination à la main en comptant le nombre d'enregistrements affichés. Je connais pas du tout VBA mais je supppose que tu boucles pour "écrire" chaque ligne dans ta page, comme ça tu connais ton nombre de lignes total, ton nombre de lignes déjà affichées.

    Citation Envoyé par Mush
    J'utilise mysql 4.1.9 et il n'est pas possible d'utiliser de count(*) sans clause group by, or je ne peux rien regrouper dans ma requete, toutes les valeures sont différentes.

    Merci pour ton aide, si t'as d'autres idées je suis preneur.
    Je pense pas que ce soit spécifique à MySQL, c'est une question de logique juste...

  7. #7
    Membre averti Avatar de supernova
    Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    447
    Détails du profil
    Informations personnelles :
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2005
    Messages : 447
    Points : 415
    Points
    415
    Par défaut
    Salut,


    Tu veux compter tes enregistrements, fait un count sur un champ quelqonque :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT COUNT(champ1) as nb FROM maTable;

    Note j'ai peut être pas pris en compte toutes tes contraintes..

  8. #8
    Membre averti Avatar de supernova
    Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    447
    Détails du profil
    Informations personnelles :
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2005
    Messages : 447
    Points : 415
    Points
    415
    Par défaut
    Pour pouvoir naviguer dans tes enregistrements tu pourrais stocker la clé primaire dans un tableau avec comme indice le numéro de l'enregistrement (la séquence) et comme valeur la clé.. peut être c'est une suggestion..

  9. #9
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 13
    Points : 7
    Points
    7
    Par défaut
    D'accord mais comment veux tu connaitre le nombre total d'enregistrements si tu ne l'éxécutes pas au moins une fois entièrement (ou avec un count). Si tu fais des LIMIT successifs tu ne peux connaitre le total d'enregistrements qu'à la fin. Non?
    Je pensai que SQL pouvez donner le nombre de résultat sans chercher les resultats eux meme. (j'y connais rien en mecanisme de SGBDR)

    Sinon passes-toi du LIMIT et gère la pagination à la main en comptant le nombre d'enregistrements affichés. Je connais pas du tout VBA mais je supppose que tu boucles pour "écrire" chaque ligne dans ta page, comme ça tu connais ton nombre de lignes total, ton nombre de lignes déjà affichées.
    C'est déjà ce que je fais, via un objet recordset de vba, mais quand le recordset contient plusieur milliers d'enregistrements, sa manipulation est trop lente à mon gout. (comme aller au premier enregistrement, puis au dernier, prendre les enregistrements 450 à 500, etc.)

    C'est pour ça que je voulais utiliser les "limit". Mais ça me semble compromis.

    Merci de ton aide

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    133
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 133
    Points : 105
    Points
    105
    Par défaut
    Sinon si tu as le temps, tu peux tester la solution avec le count.
    Tu fais ton count pour avoir le nombre total d'enregistrements. Puis après tu exécutes à la demande ta requête pour les 50 enregistrements qu'on veut consulter avec ton limit.


    Edit : Je sais pas si en MySQL on peut lui dire : renvoie moi les enregistrements entre le centième et le cent-cinquantième...

  11. #11
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 13
    Points : 7
    Points
    7
    Par défaut J'ai trouvé!!!
    Grace à une requete imbriquée:

    SELECT count( * )
    FROM (

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    SELECT Plainte.NumeroTicket, Plainte.DateCreation, typeincident.nomtype, SegmentClient.NomSegmentClient, Service.NomService, QDF.NomQDF, Region.NomRegion, Plainte.CodePostal, localite.Localite, Constructeur.NomConstructeur, Terminaux.Modele, gestionnaire.identifiant, Plainte.MSISDN
    FROM plainte
    LEFT JOIN typeincident ON Plainte.Reftypeincident = typeincident.reftype
    LEFT JOIN service ON Plainte.RefService = Service.RefService
    LEFT JOIN segmentclient ON SegmentClient.RefSegmentClient = Plainte.RefSegmentClient
    LEFT JOIN localite ON localite.RefLocalite = Plainte.RefLocalite
    LEFT JOIN region ON Plainte.RefRegion = Region.RefRegion
    LEFT JOIN qdf ON Plainte.RefQDF = QDF.RefQDF
    LEFT JOIN constructeur ON Plainte.RefConstructeur = Constructeur.RefConstructeur
    LEFT JOIN terminaux ON Terminaux.RefTerminaux = Plainte.RefTerminaux
    LEFT JOIN gestionnaire ON gestionnaire.refgestionnaire = plainte.refgestionnaire
    WHERE plainte.numeroticket <> 'nawak'
    AND Plainte.DateCreation >= '2007-01-01'
    AND Plainte.DateCreation <= ' 2007-02-02'
    ORDER BY Plainte.DateCreation
    )p2
    Finalement je sais pas si c'est beaucoup plus rapide que de compter les resultats via vba, il faut que je fasse des tests.

    J'espere que ça pourra inspirer d'autres gens.

    Pour finir une ptite pensée philosophique:

    Tout personne qui ne rote pas et ne pête pas est vouée à l'explosion.

  12. #12
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    133
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 133
    Points : 105
    Points
    105
    Par défaut
    Oui, ou directement

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    SELECT count(Plainte.NumeroTicket)
    FROM plainte
    LEFT JOIN typeincident ON Plainte.Reftypeincident = typeincident.reftype
    LEFT JOIN service ON Plainte.RefService = Service.RefService
    LEFT JOIN segmentclient ON SegmentClient.RefSegmentClient = Plainte.RefSegmentClient
    LEFT JOIN localite ON localite.RefLocalite = Plainte.RefLocalite
    LEFT JOIN region ON Plainte.RefRegion = Region.RefRegion
    LEFT JOIN qdf ON Plainte.RefQDF = QDF.RefQDF
    LEFT JOIN constructeur ON Plainte.RefConstructeur = Constructeur.RefConstructeur
    LEFT JOIN terminaux ON Terminaux.RefTerminaux = Plainte.RefTerminaux
    LEFT JOIN gestionnaire ON gestionnaire.refgestionnaire = plainte.refgestionnaire
    WHERE plainte.numeroticket <> 'nawak'
    AND Plainte.DateCreation >= '2007-01-01'
    AND Plainte.DateCreation <= ' 2007-02-02'
    ORDER BY Plainte.DateCreation
    Citation Envoyé par Mush
    Pour finir une ptite pensée philosophique:

    Tout personne qui ne rote pas et ne pête pas est vouée à l'explosion.
    Interressant...Expérience personnelle? ( )

  13. #13
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 13
    Points : 7
    Points
    7
    Par défaut Olalala
    SELECT count(Plainte.NumeroTicket)
    FROM plainte
    Quand je vois une solution aussi evidente je m'aperçois que je suis vraiment une grosse buse en SQL.

    Tout personne qui ne rote pas et ne pête pas est vouée à l'explosion.
    Je crois qu'on peux le prouver grâce aux lois de la thermodynamique.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. nombre de resultat d'une requete
    Par luisattack dans le forum Bases de données
    Réponses: 1
    Dernier message: 15/02/2006, 14h14
  2. nombre de resultats apres une requete
    Par Nico66 dans le forum Décisions SGBD
    Réponses: 5
    Dernier message: 25/05/2005, 16h16
  3. Réponses: 2
    Dernier message: 29/11/2004, 12h13
  4. Syntaxe pour avoir un seul resultat dans une requete
    Par Pompil dans le forum Requêtes
    Réponses: 2
    Dernier message: 06/09/2003, 15h51
  5. [VB6] [Excel] Résultat d'une requete ds une feuille
    Par elifqaoui dans le forum VB 6 et antérieur
    Réponses: 12
    Dernier message: 07/01/2003, 17h52

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo