Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 12-04-2010 12:50:02

Wiinner
Membre
Date d'inscription: 31-03-2010
Messages: 26

Comment faire un Group Concat

Bonjour,
j'ai un petit souci en utilisant Zend Framework et ma base mysql.

Je vais commencer par expliquer le contexte, histoire que çà soit un peu plus clair.

Je dispose d'une table "notes" :

CREATE TABLE notes (
id int(50) NOT NULL AUTO_INCREMENT,
user_id int(50) NOT NULL,
note int(3) NOT NULL,
numero_controle int(4) NOT NULL,
PRIMARY KEY  (id)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=1;

INSERT INTO notes VALUES('', '1', '12', '1');
INSERT INTO notes VALUES('', '2', '13', '1');
INSERT INTO notes VALUES('', '3', '14', '1');
INSERT INTO notes VALUES('', '4', '15', '1');
INSERT INTO notes VALUES('', '1', '11', '2');
INSERT INTO notes VALUES('', '2', '18', '2');
INSERT INTO notes VALUES('', '3', '16', '2');
INSERT INTO notes VALUES('', '4', '9', '2');

J'ai dans cette base, 4 utilisateurs, possédant chacun 2 notes (représentant 2 controles).
J'aimerais pouvoir faire de cela une sorte de tableau.

A chaque ligne correspondrait 1 utilisateur. Et les colonnes représenteraient les controles.
Autrement dit j'aimerais avoir

1           12             11
2           13             18
3           14             16
4           15             9

Alors dans ma requête je me suis dit que j'allais faire un group by sur user_id puis un group_concat pour regrouper les notes de mes différents contrôles, mais apparemment, le group_concat ne marche pas sous zend (ou alors je sais pas l'utiliser).

Je vous joins la requete que j'utilisais :
$select = $this->getDbTable()->select();
            $select->from(array('table' => 'notes'),
                        array('id', 'user_id', 'note' => GROUP_CONCAT('note' SEPARATOR "-"), 'numero_controle' => GROUP_CONCAT('numero_controle' SEPARATOR "-")        
                    );
            $select->setIntegrityCheck(false);
            $select->group('user_id');
            $resultSet = $this->getDbTable()->fetchAll($select);

Existe-t-il une méthode de regrouper proprements les notes de mes étudiants ? (j'imagine mais pas trouvé)
Ou est ce que je dois bidouiller, et regrouper tout çà à la main moi même après l'obtention des lignes ?

Voila, j'espère que vous serez en mesure de m'aider.
Cordiallement smile

Hors ligne

 

#2 12-04-2010 13:57:02

sekaijin
Membre
Date d'inscription: 17-08-2007
Messages: 1137

Re: Comment faire un Group Concat

Code:

$select = $this->getDbTable()->select()
  ->from(array('n1' =>'notes'), array(
    'id', 'user_id',
    'note 1' => 'note'))
  ->where('n1.numero_controle = 1')
  ->join(array('n2' =>'notes'), 'n1.id = n2.id AND n2.numero_controle = 2', array(
    'id', 'user_id',
    'note 2' => 'note'));
$resultSet = $this->getDbTable()->fetchAll($select);

Code:

$select = $this->getDbTable()->select()
  ->from(array('table' => 'notes'), array(
    'id', 'user_id',
    'note' => new Zend_Db8expr('GROUP_CONCAT(note SEPARATOR "-")'),
    'numero_controle' => new Zend_Db8expr('GROUP_CONCAT(numero_controle SEPARATOR "-")')
  );
  ->setIntegrityCheck(false)
  ->group('user_id')
$resultSet = $this->getDbTable()->fetchAll($select);

Dernière modification par sekaijin (12-04-2010 13:59:51)

Hors ligne

 

#3 12-04-2010 14:14:03

Wiinner
Membre
Date d'inscription: 31-03-2010
Messages: 26

Re: Comment faire un Group Concat

Déjà merci de ta réponse.
Mais ce que je disais était un exemple.
Il pourra y avoir plus de deux notes (c'est pour développer un module de controle pour des collèges).
Donc je ne suis pas sur que çà me convienne parfaitement (mais cela vient de mon erreur d'explication).

En tout cas merci, et je vais regarder de plus près Zend_Db8expr smile

[EDIT]
Autant pour moi, c'était Zend_Db_expr et en fait, je me suis rendu compte que tu m'as proposé deux solutions distinctes, donc je vais regarder plus en détail la seconde :p

Merci encore smile

Dernière modification par Wiinner (12-04-2010 14:17:36)

Hors ligne

 

#4 15-04-2010 14:37:55

Wiinner
Membre
Date d'inscription: 31-03-2010
Messages: 26

Re: Comment faire un Group Concat

Bon, bah çà marche niquel.
Par contre, je suis confronté à un petit problème.

Le group concat ne s'effectue toujours pas dans le même ordre.

Donc pour résumé à nouveau, chaque étudiant a plusieurs notes.
J'effectue un group_concat pour récupérer toutes les notes dans un même string.

Mais parfois, il me met :
12-11-15-18 et d'autre fois 12-11-18-15 par exemple.
Alors je me suis dit que cela venait d'un problème d'order by.

Mais ma requête ne semble pas marcher :
$select = $this->getDbTable()->select()
                  ->from(array('table' => 'notes'), array(
                    'id', 'user_id',
                    'note' => new Zend_Db_expr('GROUP_CONCAT(note SEPARATOR "-")'),
                    'id_controles' => new Zend_Db_expr('GROUP_CONCAT(id_controle SEPARATOR "-")'),
                      'nombre_controle' => 'COUNT(id_controle)'
                     
                      ))
                  ->order(array('id_controle ASC'));
              $select->setIntegrityCheck(false)
                  ->group('user_id');

(ps : j'ai change numero_controle par id_controle dans ma base de données).


Je vous donne ci-joint le contenu de ma base.

DROP TABLE IF EXISTS notes;
CREATE TABLE notes (
id int(50) NOT NULL AUTO_INCREMENT,
user_id int(50) NOT NULL,
note int(3) NOT NULL,
id_controle int(4) NOT NULL,
PRIMARY KEY  (id)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=1;

INSERT INTO notes VALUES('', '1', '12', '1');
INSERT INTO notes VALUES('', '2', '13', '1');
INSERT INTO notes VALUES('', '3', '14', '1');
INSERT INTO notes VALUES('', '4', '15', '1');
INSERT INTO notes VALUES('', '1', '11', '2');
INSERT INTO notes VALUES('', '2', '18', '2');
INSERT INTO notes VALUES('', '3', '16', '2');
INSERT INTO notes VALUES('', '4', '9', '2');
INSERT INTO notes VALUES('', '1', '15', '3');
INSERT INTO notes VALUES('', '1', '18', '4');

Voila, je vais essayer de faire du debuggage de bas niveau pour trouver d'où vient l'erreur, mais si vous avez une idée, je suis encore preneur :p

Merci d'avance


[Edit]
J'ai un peu modifié mon code :

$select = $this->getDbTable()->select()
                  ->from(array('table' => 'notes'), array(
                    'id', 'user_id',
                    'note' => new Zend_Db_expr('GROUP_CONCAT(note ORDER BY id_controle ASC SEPARATOR "-" )'),
                    'id_controles' => new Zend_Db_expr('GROUP_CONCAT(id_controle ORDER BY id_controle ASC SEPARATOR "-" )'),
                      'nombre_controle' => 'COUNT(id_controle)'
                     
                      ))
                  ->order(array('id_controle ASC'));
              $select->setIntegrityCheck(false)
                  ->group('user_id');

Alors maintenant, l'ordre ne change plus.
Mais quand je fais un print_r j'ai 2 éléments qui sont inversés :

Application_Model_Notes Object ( [_id:protected] => 1 [_user_id:protected] => 1 [_note:protected] => 12-11-18-15 [_id_controle:protected] => 1-2-3-7 [_nombre_controle:protected] => 4 )

Dans note, je devrais avoir 12-11-15-18 puisque l'id_controle 3 est associé à la note 15, et l'id_controle 4 à la note 18.
Voila. Pour résumé, mes id_controles sont bien triés, mais les notes associés, quant à elles ne sont pas triés dans le même ordre.

Dernière modification par Wiinner (15-04-2010 15:36:15)

Hors ligne

 

#5 15-04-2010 15:49:45

Wiinner
Membre
Date d'inscription: 31-03-2010
Messages: 26

Re: Comment faire un Group Concat

Bon bah en fait, j'ai résolu mon problème.
C'était un traitement sur une autre page qui venait traiter mes données, et me changer mon ordre :p

Désolé pour le dérangement.

Hors ligne

 

Pied de page des forums

Propulsé par PunBB
© Copyright 2002–2005 Rickard Andersson
Traduction par punbb.fr

Graphisme réalisé par l'agence Rodolphe Eveilleau
Développement par Kitpages