Développer avec RBS Change : Comment transformer requete sql en query
-
03/08/2010 17:43
Je veux exécuter la requete suivante :select count(distinct(maPropriete)) from m_module_doc_mondoc where autreProp = 'test'
Comment je peux faire ça avec une query ?
J'ai essayé de mixer des projections (groupBy, rowCount, count, property) mais j'arrive toujours la génération suivante :count(distinct t1.document_id)
qui ne me va pas car ce n'est pas le bon champ -
Si tu veux la répartition des documents selon la valeur de maPropriete sur l'ensemble des documents qui ont autreProp valant 'test', tu peux essayer quelque chose comme :
$query = module_MondocService::getInstance(); $query->add(Restrictions::eq('autreProp', 'test')); $query->setProjection(Projections::groupProperty('maPropriete'), Projections::rowCount());
-
17995.3 en réponse à 17995.2 écrit par Alexandre Simon
04/08/2010 08:52
Déjà fait ça mais ça ne va pas, la requête suivante est générée :select t1.docid as docId, count(distinct t1.document_id) as rowcount from m_module_doc_mondoc t1 inner join f_document t0 using(document_id) where (t1.autreProp = 'test') group by t1.docid
Le count est toujours fait sur document_id au lieu de mon champ docId -
Au final, un distinct porte de toutes façons sur l'ensemble de la ligne et le SQL généré est plutôt de la forme :
select t1.maPropriete as maPropriete, count(distinct t1.document_id) as count from m_module_doc_mondoc t1 where (t1.autreProp = 'test') group by t1.maPropriete
Ce qui je pense donne le bon résultat, à savoir un tableau qui ressemble à :array ( 0 => array ( 'maPropriete' => 'une valeur', 'count' => <nombre de documents ayant maPropriete = 'une valeur'>, ), 1 => array ( 'maPropriete' => 'une autre valeur', 'count' => <nombre de documents ayant maPropriete = 'une autre valeur'>, ), ... )
-
17995.5 en réponse à 17995.4 écrit par Alexandre Simon
04/08/2010 10:19
Ben non, si je veux un count(distinct()) c'est pour avoir une seule ligne en retour, pas un count sur chaque élément que je dois parser et additionner pour avoir mon chiffre final -
J'avais pas compris ça : tu ne veux donc pas la répartition dont je parlais.
Si tu veux le nombre de valeurs distinctes de maPropriete, tu peux utiliser la requête donnée et faire un count() :$maProprieteInfo = $query->find(); count($maProprieteInfo);
A ma connaissance, l'API en place ne permet pas d'exprimer directement la requête souhaitée (sauf en faisant un Provider->getDriver()->execute())
Faudrait peut-être pouvoir faire un truc du genre :$query = module_MondocService::getInstance(); $query->add(Restrictions::eq('autreProp', 'test')); $query->setProjection(Projections::distinctCount('maPropriete'));
-
17995.7 en réponse à 17995.6 écrit par Alexandre Simon
04/08/2010 11:13
Demande d'évolution faite : Ajout d'une projection
Merci de prendre connaissance et de respecter les règles des forums.