Développer avec RBS Change : Comment transformer requete sql en query

  • 17995.1

    03/08/2010 17:43


    teles
    Rang : Adepte
    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
  • 17995.2 en réponse à 17995.1 écrit par teles

    03/08/2010 21:32


    Alexandre Simon
    Titre : Développeur RBS Change
    Rang : Expert
    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


    teles
    Rang : Adepte
    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
  • 17995.4 en réponse à 17995.3 écrit par teles

    04/08/2010 10:02


    Alexandre Simon
    Titre : Développeur RBS Change
    Rang : Expert
    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


    teles
    Rang : Adepte
    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
  • 17995.6 en réponse à 17995.5 écrit par teles

    04/08/2010 11:07


    Alexandre Simon
    Titre : Développeur RBS Change
    Rang : Expert
    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


    teles
    Rang : Adepte
    Demande d'évolution faite : Ajout d'une projection
 
Merci de prendre connaissance et de respecter les règles des forums.
 
1359 membres
Aucun membre connecté