2011-11-08 3 views
2

Je ne suis pas familier avec FLOW3 et je suis tout nouveau dans Doctrine.FLOW3 Doctrine2 :: SELECT b, comptez (b) FROM (SÉLECTIONNEZ a, b FROM x y z GROUP BY a) GROUP BY b

Je ne fais que quelques tests, et je veux apprendre ou comprendre certaines techniques que j'utiliserai plus tard. Maintenant, je suis coincé avec cette partie de la doctrine où je veux générer des statistiques.

$results = $this->entityManager 
    ->createQuery('SELECT version,count(version) 
     FROM (SELECT device, version 
      FROM \MyStuff\Stats\Domain\Model\Stat 
      WHERE 
       date > \'2011-10-01 00:00:00\' and 
       date < \'2011-10-02 00:00:00\' 
      GROUP BY device) GROUP BY version') 
    ->getResult(); 

J'ai demandé à d'autres endroits aussi, où ils me dirigés vers le Doctrine Docs. Eh bien, maintenant il y a plusieurs exemples mais ces 2 lignes sont triviales et je n'ai trouvé aucun exemple lié à ce genre de sous-sélection.
J'espère que quelqu'un ici pourra m'aider.

Edit:
Je voudrais résoudre ce en utilisant dql.
J'ai essayé de résoudre ce en utilisant un QueryBuilder, mais on m'a dit que QueryBuilder = dql

Edit 2:
Maintenant, on m'a dit que Doctrine2 ne supporte pas les sous-requêtes dans « FROM (SUBSELECT) » mais il fait "... WHERE IN (SUBSELECT)" et que l'on pourrait réécrire ma requête au format IN(). Eh bien, essayant de comprendre ça maintenant.

Édition 3: Je ne parviens pas à réécrire la sous-requête à partir d'une sous-requête. Donc ... dql ne fait pas de sous-requêtes et il n'y a pas d'autre moyen de faire ce que je veux avec dql?! Alors dql manquerait d'une fonctionnalité très importante je dirais. Ou suis-je juste ne pas voir sth. ici ?

Edit 4: J'ai finalement obtenu le en sous-requêtes, mais il était environ 10 fois plus lente (4 secondes au lieu de 0,4) et maintenant on m'a dit que certains types de doctrine de #doctrine, que je devrais utiliser le nativeQuery fonction à la place.

Edit 5: Il fonctionne à l'aide du nativeQuery maintenant, voir ma réponse à cette question ...

Répondre

0

En utilisant une requête native, il fonctionne comme ça ...

$rsm = new \Doctrine\ORM\Query\ResultSetMapping(); 
$rsm->addScalarResult('version', 'version'); 
$rsm->addScalarResult('count', 'count'); 
$results = $this->entityManager 
    ->createNativeQuery(
     'SELECT version, COUNT(version) as count FROM 
     (
      SELECT device, version 
      FROM mystuff_stats_domain_model_stat 
      WHERE 
       date > \'2011-10-01 00:00:00\' and 
       date < \'2011-10-02 00:00:00\' 
      GROUP BY device 
     ) 
     as devices GROUP BY version',$rsm) 
    ->execute(); 
echo var_dump($results,true); 
Questions connexes