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

Zend_Db PHP Discussion :

Même select() pour limit et total ?


Sujet :

Zend_Db PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2002
    Messages : 16
    Par défaut Même select() pour limit et total ?
    Bonjour à tous!

    Pour un projet de listing de livres, je suis passé de Doctrine à Zend_Db pour la gestion de la base de données. J'ai probablement pris pleins d'habitudes bonnes et moins bonnes avec Doctrine, mais là, je sèche méchamment sur un point.

    J'ai une requête comme ceci (en gros):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $table = new Livres();
    $select = $table->select()->joinLeft(...)->order(...)
        ->where('un filtre utilisateur')
        ->where('un autre filtre utilisateur')
        ->where('etc...')
        ->limit(10, 20);
     
    $rowset = $table->fetchAll($select);
    Ceci fonctionne à merveille. Tout est très bien, c'est très bien. Maintenant, je souhaite retrouver le total (là je n'ai que 10 éléments).

    J'ai donc tenté un truc tout bête:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    // juste en dessous:
            $select
                ->reset(Zend_Db_Select::LIMIT_COUNT)
                ->reset(Zend_Db_Select::LIMIT_OFFSET);
     
            $rows = $table->fetchAll($select);
            echo $rows->count();
    Et c'est là que rien ne va plus. ça me retourne 4x tous les résultats. Je n'ai aucune idée pourquoi.

    Certes, je pourrais réécrire toute la requête en changeant le select et en ne mettant pas la limit, mais je me demandais si on pouvait trafiquer un select pour faire un count "intelligent".

    Merci d'avance pour vos éclaircissements ou vos conseils!
    rekam

  2. #2
    Expert confirmé
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 55

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Par défaut
    Bonjour,

    pour obtenir un nombre de lignes autant utiliser les fonctions d'agrégations de SQL. Pour cela, il suffit de construire le select sans clause LIMIT, de le dupliquer, et de remplacer dans la copie la liste des champs par un COUNT(*). Tu peux ensuite ajouter le LIMIT à la requête d'origine pour obtenir ton jeu d'enregistrements. Ce qui donne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    $select = $table->select()->joinLeft(...)->order(...)
        ->where('un filtre utilisateur')
        ->where('un autre filtre utilisateur')
        ->where('etc...');
     
    $select_count = clone $select;
    $select_count->reset(Zend_Db_Select::COLUMNS);
    $select_count->columns(array('nb' => 'COUNT(*)'));
    $res = $select_count->query()->fetchAll();
    $nb_rows = $res[0]['nb'];
    unset($select_count);
     
    $select->limit(10, 20);
    J'utilise cette technique dans une aide d'action « maison » pour alimenter un jqGrid, et cela fonctionne parfaitement sans consommer inutilement des ressources. Un seul bémol, la technique du COUNT(*) ne fonctionne pas si la requête comporte une clause DISTINCT; dans ce cas, il n'y a rien d'autre à faire que d'exécuter la requête originale sans LIMIT, et de compter le nombre de lignes dans le tableau de résultat (ce que tu as tenté de faire).
    FAQ XML
    ------------
    « Le moyen le plus sûr de cacher aux autres les limites de son savoir est de ne jamais les dépasser »
    Giacomo Leopardi

  3. #3
    Membre Expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Par défaut
    On peut également utiliser l'option SQL_CALC_FOUND_ROWS.

    Plus d'infos ici :

    http://dev.mysql.com/doc/refman/5.0/...functions.html

  4. #4
    Expert confirmé
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 55

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Par défaut
    Citation Envoyé par s.n.a.f.u Voir le message
    On peut également utiliser l'option SQL_CALC_FOUND_ROWS.
    En dehors du fait qu'il s'agit d'une extension à SQL spécifique à MySQL, je me demande si la syntaxe des requêtes utilisant cette fonction est compatible avec Zend_Db_Select... De plus, il faut lancer derrière un SELECT FOUND_ROWS(); pour obtenir le total de lignes. C'est peut-être un plus performant en terme de requête, mais le code PHP reste sensiblement le même.
    FAQ XML
    ------------
    « Le moyen le plus sûr de cacher aux autres les limites de son savoir est de ne jamais les dépasser »
    Giacomo Leopardi

Discussions similaires

  1. Réponses: 3
    Dernier message: 16/04/2009, 12h00
  2. select dans le même genre que LIMIT
    Par HwRZxLc4 dans le forum Requêtes
    Réponses: 2
    Dernier message: 20/09/2008, 14h25
  3. Limiter la saisie d'un même paramètre pour deux requêtes
    Par seba2004 dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 07/08/2007, 07h25
  4. un Select pour declencher une boucle
    Par vijeo dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 17/12/2004, 15h14
  5. Requete select pour récupérer les no match entre 2 tables
    Par Celina dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 16/12/2003, 11h59

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