【问题标题】:Doctrine orderBy on SUM() field with alias带有别名的 SUM() 字段上的学说 orderBy
【发布时间】:2013-03-12 14:01:02
【问题描述】:

我正在尝试在教义上做一个简单的查询,但很挣扎。

$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 不支持这个。

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

【问题讨论】:

    标签: php doctrine-orm doctrine doctrine-query


    【解决方案1】:
    1. 您可以通过使用 AS 对结果进行别名化,在查询投影中列出 SUM 结果字段来排序。
    2. 如果要使用MIN()MAX()AVG()等聚合函数,则必须使用GROUP BY

    尝试与此类似,这对我来说非常有效(顺便说一句,而不是 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): http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html

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

    【讨论】:

    • 这有帮助,谢谢,现在我只在开始使用 setFirstResult 进行分页时遇到问题。“执行 'SELECT * FROM (SELECT ROW_NUMBER() OVER (ORDER BY sclr4 DESC) 时发生异常AS Academic_rownum ...”显然给出了“无效的列名'sclr4'。”但我似乎无法弄清楚如何阻止它!
    • @YorkshireDeveloper 你有没有想过为什么会出现“无效的列名'sclr4'”异常?我也有同样的问题。
    猜你喜欢
    • 2018-12-13
    • 1970-01-01
    • 1970-01-01
    • 2017-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多