带有别名的SUM()字段上的Doctrine order

时间:2013-03-22 16:12:21

标签: php doctrine-orm doctrine doctrine-query

我试图在学说中做一个简单的查询但是很挣扎。

$query->select(array(
    'app_title' => 'u.title',
    'user_name' => 'u.user_name',
    'first_used' => 'MIN(u.creation_time)',
    'last_used' => 'MAX(u.stop_time)',
    'total_usage' => 'SUM(u.stream_seconds)',
))
->from(self::USAGE_TABLE, 'u')
->orderBy('total_usage', 'DESC');

显然我得到一个关于列名称未知的错误,因为Doctrine正在使用它自己的别名(sclr4)。

但是,如果我尝试按实际价值排序; SUM(u.stream_seconds),然后我在order by子句中得到一个意外的括号,我很确定SQL不支持这个。

因此,我只是尝试将数据放入表中并处理列的排序。这看起来很简单,我该怎么做?有什么想法吗?

1 个答案:

答案 0 :(得分:22)

  1. 您可以通过使用AS通过别名结果在查询投影中将其列在SUM结果字段中进行排序。
  2. 如果您想使用MIN()MAX()AVG()等汇总功能,则必须使用GROUP BY
  3. 尝试使用simmilar,这对我来说非常合适(BTW而不是select方法中的关联数组):

    $q = $this->em()->createQueryBuilder();
    
    $q->select(['product.id', 'product.title'])
      ->addSelect('SUM(product.price) AS HIDDEN stat_sum_realised')
      ->from('ModuleAdmin\Entity\ProductEntity', 'product')
      ->groupBy('product.id');
    
    $q->orderBy('stat_sum_realised', 'DESC');
    

    此处详细介绍了聚合函数(对于MySQL的e.x.): http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html

    从Doctrine ORM 2.3开始,您还可以使用HIDDEN关键字,这样可以避免(在这种情况下)stat_sum_realised为您的结果集注入水分。