Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 12-08-2010 14:29:27

Geoffrey
Membre
Lieu: 63
Date d'inscription: 12-04-2007
Messages: 140
Site web

[Résolu][Zend_DB] Traduction d'une requête

Bonjour, je souhaite écrire la requête suivante en langauge Zend_Db_Table, mais je sèche un peu :

Code:

SELECT pr_id, pr_nom, pr_prenom,
  (SELECT COUNT(*) FROM eq_parclogement__logements WHERE pr_id=eq_parclogement__proprietaires.pr_id AND log_suppr=0) AS total,
  (SELECT COUNT(*) FROM eq_parclogement__logements WHERE pr_id=eq_parclogement__proprietaires.pr_id AND log_suppr=0 AND log_etat='libre') AS libre
FROM eq_parclogement__proprietaires
WHERE pr_suppr=0

Quelqu'un peut m'expliquer comment on écrit des sous-requêtes en ZF, je ne trouve rien là-dessus.

Merci

Geoffrey

Dernière modification par Geoffrey (17-08-2010 18:04:12)

Hors ligne

 

#2 12-08-2010 14:49:38

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

Re: [Résolu][Zend_DB] Traduction d'une requête

Heu il te faut lire la doc de Zend_Db_Select

mais avant tout il te faut une reqête SQL qui fonctionne ce dont je doute fortement pour celle que tu as fourni

A+JYT

Hors ligne

 

#3 12-08-2010 14:59:26

Geoffrey
Membre
Lieu: 63
Date d'inscription: 12-04-2007
Messages: 140
Site web

Re: [Résolu][Zend_DB] Traduction d'une requête

sekaijin a écrit:

Heu il te faut lire la doc de Zend_Db_Select

J'ai regardé dans Zend_Db_Table et Zend_Db_Select, mais je n'ai rien trouvé sur la notion de sous-requête.

sekaijin a écrit:

mais avant tout il te faut une reqête SQL qui fonctionne ce dont je doute fortement pour celle que tu as fourni

Si si, elle marche très bien, parce que du coup pour le moment, j'exécute cette requête en l'état dans un $db->query();

Geoffrey

Hors ligne

 

#4 13-08-2010 17:21:23

omega2
Membre
Lieu: Boisbriand, quebec, canada
Date d'inscription: 01-04-2009
Messages: 85
Site web

Re: [Résolu][Zend_DB] Traduction d'une requête

Salut,
Regarde du côté des méthodes "join()", "leftjoin()" etc.

Pour ta requête tu peux t'en sortir avec une jointure à condition de mettre un Zend_db_expr à la place de tes sous requêtes "libre" et "total". Il te faudra aussi un "group by" sur le propriétaire (en Zend, c'est la méthode "group()" du Zend_Db_Select) . L'expression du "libre" sera du genre "SUM(if(log_etat='libre',1,0))" et celle du total un simple "count".

sekaijin > Ce genre de requête fonctionne très bien avec entre autre mysql mais n'est pas optimisé pour ne pas dire qu'elle sera très lente pour peu que le moteur de la base de donnée ne la transforme pas en jointure à la volé.

Hors ligne

 

#5 17-08-2010 14:48:10

Geoffrey
Membre
Lieu: 63
Date d'inscription: 12-04-2007
Messages: 140
Site web

Re: [Résolu][Zend_DB] Traduction d'une requête

Bonjour,

omega2 a écrit:

Pour ta requête tu peux t'en sortir avec une jointure à condition de mettre un Zend_db_expr à la place de tes sous requêtes "libre" et "total". Il te faudra aussi un "group by" sur le propriétaire (en Zend, c'est la méthode "group()" du Zend_Db_Select) . L'expression du "libre" sera du genre "SUM(if(log_etat='libre',1,0))" et celle du total un simple "count".

J'avais effectivement regardé au niveau des jointures, tout allait très bien pour l'un des 2 totaux, mais dès que je voulais rajouter le 2e, ca me mettait tout en vrac. Je n'avais pas pensé à la technique du SUM, je vais tenter et je vous tiens au courant.

Merci

Geoffrey

Dernière modification par Geoffrey (17-08-2010 14:48:38)

Hors ligne

 

#6 17-08-2010 18:03:57

Geoffrey
Membre
Lieu: 63
Date d'inscription: 12-04-2007
Messages: 140
Site web

Re: [Résolu][Zend_DB] Traduction d'une requête

Bonjour,

Suite à la réponse d'omega2, voici comment ma requête est construite :

Code:

$tbParclogementProprietaires    = new Modules_Parclogement_Models_DbTable_parclogementProprietaires();

$sql = $tbParclogementProprietaires
  ->select(Zend_Db_Table::SELECT_WITH_FROM_PART)
  ->setIntegrityCheck(false)
  ->from(null, array('total'=>'COUNT(log_id)', 'libre'=>'SUM(log_etat=\'libre\'')'))
  ->joinUsing('eq_parclogement__logements',    'pr_id')
  ->where('log_suppr=0')
  ->where('pr_suppr=0')
  ->group('eq_parclogement__proprietaires.pr_id')
;

$listeProprietaires = $tbParclogementProprietaires->fetchAll($sql);

Merci à tous

Geoffrey

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