Doctrine:DQL中的子查询

时间:2012-06-18 16:49:50

标签: doctrine subquery dql

我正在尝试在一个表上使用DQL计算值。假设此表名为“TABLE”。它有5个列:

  • ID
  • PEOPLE_COUNT
  • animal_count
  • 的region_id
  • TYPE_ID

我正在寻找的结果是人的总和(按地区分组)除以动物总数(按类型分组);

SQL就是这样的:

SELECT SUM(people_count) / 
(
    SELECT SUM(animal_count) 
    FROM TABLE t2 
    GROUPED BY type_id
) 
FROM TABLE t1 
GROUPED BY region_id

你如何使用DQL在Doctrine中做到这一点?

2 个答案:

答案 0 :(得分:1)

我通过创建另一个查询,执行它并将结果包含在第一个查询中来解决我的问题。

如果您正在处理一个简单的示例,这可能不是最佳方法,但对于我的代码架构而言,这是我唯一的解决方案。

答案 1 :(得分:0)

我有一个解决方案,但我认为可能有一个解决问题的最佳解决方案。

在任何情况下,进行两次查询并在第二次查询中导入第一个查询结果可以是一个解决方案。不幸的是,它对我们的数据库来说使用率很低。更多,有时我们必须只执行一个SQL来对每个示例的列结果进行排序。

<?php

namespace AppBundle\Repository;

use AppBundle\Entity\MyClass;
use Doctrine\ORM\EntityRepository;

class MyRepository extends EntityRepository
{
    public function findWithSubQuery()
    {
        return $this->createQueryBuilder('a')
                    ->addSelect(sprintf(
                        "(SELECT COUNT(b.id) FROM %s AS b WHERE b.a = a.id GROUP BY a.id) AS otherColumn",
                        MyClass::class
                    ))
                    ;
    }
}

我使用这个解决方案。也许子查询可以使用DQL ojbect而不是DQL字符串。