FLOW3 Doctrine2 :: SELECT b,count(b)FROM(SELECT a,b FROM x \ y \ z GROUP BY a)GROUP BY b

时间:2011-11-08 08:48:56

标签: doctrine-orm entitymanager subquery typo3-flow

我对FLOW3很新,而且我对Doctrine很新。

我只是在进行一些测试,我想学习或理解一些我将在以后使用的技术。现在我坚持这个学说部分,我想生成一些统计数据。

$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();

我也在其他地方问过,他们把我引导到Doctrine Docs。 那么,现在有几个例子,但是这两个衬里是微不足道的,我找不到任何与这种子选择相关的例子。
所以我希望有人可以帮助我。

编辑:
我想用dql来解决这个问题 我尝试使用querybuilder解决这个问题,但我被告知querybuilder!= dql

编辑2:
现在我被告知doctrine2不支持“FROM(SUBSELECT)”中的子选择,但是它确实“...... WHERE IN(SUBSELECT)”并且可以将我的查询重写为IN()形式。好吧,现在试着解决这个问题。

编辑3: 我没有将from-subquery重写为子查询。所以... dql不做子查询,没有其他方法可以用dql做我想要的东西?!然后dql将缺乏一个非常重要的功能,我会说。或者我只是没有看到某事。在这?

编辑4: 我终于得到了子查询,但它慢了大约10倍(4秒而不是0.4)现在我被#doctrine的一些教义人告诉我,我应该使用nativeQuery函数。

编辑5: 它现在使用nativeQuery,请参阅我的答案......

1 个答案:

答案 0 :(得分:0)

使用原生查询就像那样......

$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);