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 :

Zend et requête affichage count et group by


Sujet :

Zend_Db PHP

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    mai 2011
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : mai 2011
    Messages : 16
    Points : 12
    Points
    12
    Par défaut Zend et requête affichage count et group by
    Salut a tous =)
    Voila il se trouve que j'ai encore un problème avec Zend, cela ne fait que quelques semaines (quelques heures surtout) que je suis dessus,
    et j'ai un problème avec l'affichage d'une requête, voici ma requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    select count(abonnement_type_id) as count from abonnements group by abonnement_type_id
    Voici ensuite mon code :
    Le controller : AbonnementsController.php
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    <?php
    public function statistiqueschiffreaffaireAction()
        {    	
        	$abonnementsTable=new Application_Model_DbTable_Abonnements();
        	$select= $abonnementsTable->select()
        	->from(array('p'=>'abonnements'),array('somme'=>'COUNT(abonnement_type_id)')); 
        	$this->view->stats_chiffreaffaires = $abonnementsTable->fetchAll($abonnementsTable->select()); 	
     
        }
    La views statistiqueschiffreaffaire.phtml
    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
    17
     
    <?php
    $this->layout()->setLayout('administration/admin'); 
     
    ?>
    <br/><br/>
    <table>
        <tr>
            <th>Titreokkkkk</th>
            <th>&nbsp;</th>
        </tr>
    <?php foreach($this->stats_chiffreaffaires as $stat_chiffreaffaire) : ?>
        <tr>
            <td><?php echo $this->escape($stat_chiffreaffaire->abonnement_type_id);?></td>
        </tr>
    <?php endforeach; ?>
    </table>
    Et le model, mais je pense que le problème de viens pas de d'ici:
    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
     
    <?php
     
    class Application_Model_DbTable_Abonnements extends Zend_Db_Table_Abstract
    {
    	protected $_name = 'abonnements';
    	protected $_primary = array('id');
    	protected $_sequence = 'abonnements_abo_id_seq';
     
    	 protected $_referenceMap    = array(
            'abonnements_types' => array(
                'columns'           => array('abonnement_type_id'),
                'refTableClass'     => 'Application_Model_DbTable_AbonnementsTypes',
                'refColumns'        => array('id'),
            		'onDelete'          => self::RESTRICT,
            		'onUpdate'          => self::RESTRICT),
    	 	'prestataires' => array(
     			'columns'	=> array('pre_id'),
     			'refTableClass' => 'Application_Model_DbTable_Prestataires',
    	 		'refColumns'	=> array('id'),
    	 			'onDelete'          => self::CASCADE,
    	 			'onUpdate'          => self::RESTRICT));
     
     
    }
    Je vous ai mit un code qui affiche quelque chose plutôt que l'erreur. Mais ce code affiche l'ensemble de mes abonnements et moi j'aimerais afficher le nombre d'abonnement en fonction en fonction du type d'abonnement(group by abonnement_type_id)

    Pour être encore un peu plus clair, voila ce que j'ai en ce moment :
    abonnement_type_id
             1
             1
             3
             3
             2
             3
             3
    et j'aimerais ça :
    abonnement_type_id	count
             1	          2
             2	          1
             3	          4
    Voila je pense que cela est pas compliqué, j'arrive à le faire avec la requête mais l'afficher avec le "langage" Zend j'y arrive pas.
    Merci de votre aide =)
    ++

  2. #2
    Membre habitué
    Avatar de Mell
    Femme Profil pro
    Développeuse Front-end
    Inscrit en
    janvier 2011
    Messages
    104
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 28
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeuse Front-end
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : janvier 2011
    Messages : 104
    Points : 140
    Points
    140
    Par défaut
    J'aurais fait un truc du genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    return $this->fetchAll(
        $this->select()
        ->from($this, COUNT(abonnement_type_id) as count)
        ->group(abonnement_type_id)
    );
    Enfin il faudrait que tu passes par ton model pour créer tes requêtes du genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public function getAllAbonnementByType() {
    return $this->fetchAll(
        $this->select()
        ->from($this, COUNT(abonnement_type_id) as count)
        ->group(abonnement_type_id)
    );
    }
    et ensuite dans ton controller

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $model = new Model();
    $requete = $model->getAllAbonnementByType();
    Ce serait plus propre

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    août 2010
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : août 2010
    Messages : 34
    Points : 46
    Points
    46
    Par défaut
    Bonjour,

    Comme signalé par mon VDD, je te recommande l'usage du ZQL fourni par Zend. Cela ne veut pas un ORM mais ça a l'avantage d'être relativement flexible et simple à mettre en place sans compter que la plupart des données sont échappées.

    En revanche, là où je reste perplexe, c'est ici :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    select count(abonnement_type_id) as count from abonnements group by abonnement_type_id
    Je ne suis pas un pro du SQL et je n'ai nullement la science infuse néanmoins je trouve étrange de rajouter une clause group by sur un champ qui n'est pas dans le SELECT. De plus, par convention, j'éviterais de nommer mon alias "count" puisqu'il s'agit d'un mot clé réservé par SQL ; histoire d'éviter des conflits

    Il faudrait également que tu rajoutes dans ta requête la colonne souhaitée, à savoir abonnement_type_id. A partir de là, ta requête devrait plus ressembler à :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT abonnement_type_id,count(abonnement_type_id) AS nbAboType FROM abonnements GROUP BY abonnement_type_id
    Ainsi, tu profiterais de ta clause GROUP BY.

    Cordialement

  4. #4
    Membre éprouvé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    août 2012
    Messages
    552
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : août 2012
    Messages : 552
    Points : 979
    Points
    979
    Par défaut
    bonjour,
    je souscris à tout ce qui vient d'être enoncé par @Cr3a_Hal0 que la colonne spécifiée dans la clause group by doit systématiquement figurer dans le select.

    Partant de la requête suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     
    SELECT abonnement_type_id,count(abonnement_type_id) AS nbAboType FROM abonnements GROUP BY abonnement_type_id
    La traduction de cette requête en ZF est la suivante:

    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
     
     
    <?php
    public function statistiqueschiffreaffaireAction()
        {    	
        	$abonnementsTable=new Application_Model_DbTable_Abonnements();
        	$select= $abonnementsTable->select()
        	->from(array('p'=>'abonnements'),array('abonnement_type_id','somme'=>'count(abonnement_type_id)'))->group('abonnement_type_id'); 
    /*
    requête sql générée:
    echo $select->__toString();
    */
        	$this->view->stats_chiffreaffaires = $abonnementsTable->fetchAll($select); 	
     
        }
    il est touttefois possible de voir la requête SQL générée en faisant un echo $select(voir commentaire)

Discussions similaires

  1. Requête avec COUNT et GROUP BY
    Par pelloq1 dans le forum Requêtes
    Réponses: 4
    Dernier message: 24/11/2014, 09h45
  2. Requête delete MySQL avec group by et count(*)
    Par monlou dans le forum Langage SQL
    Réponses: 2
    Dernier message: 13/09/2014, 07h17
  3. Requête récalcitrante avec un tri par COUNT sans GROUP BY
    Par Ancalagon77 dans le forum Requêtes
    Réponses: 1
    Dernier message: 05/10/2006, 15h27
  4. Pb de COUNT et GROUP BY simple mais sans requête imbriquées
    Par vanquish dans le forum Langage SQL
    Réponses: 3
    Dernier message: 22/10/2004, 10h45
  5. Problème dans requête avec count()
    Par BadFox dans le forum Requêtes
    Réponses: 3
    Dernier message: 08/07/2003, 19h02

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