Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Bonjour, je souhaite écrire la requête suivante en langauge Zend_Db_Table, mais je sèche un peu :
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
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
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
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
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
Bonjour,
Suite à la réponse d'omega2, voici comment ma requête est construite :
$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