cakephp 3(My)SQL聚合函数max()语法错误' AS MAX(`users`__`date_time`)AS`date`

时间:2016-01-11 09:07:24

标签: mysql sql cakephp cakephp-3.x

我正在使用cakephp 3开发一个社交应用程序。

我现在正致力于混乱功能。它以这种方式工作,在左侧显示一个用户,一个人与之交谈,中间是对话。

我希望按最后的消息传递日期对用户进行排序。意思是,如果彼得是我写的最后一个,那么彼得应该出现在最前面等等。

我有以下查询:

$query = $this->Messages
    ->find('all', [
        'fields' => [
            'MAX(`messages`.`max_date`)',
            'id',
            'sender_id',
            'reciever_id',
        ]
    ])
    ->where([
        'sender_id = ' => $active_user_id
    ])
    ->orWhere([
        'reciever_id = ' => $active_user_id
    ])
    ->group([
        'sender_id',
        'reciever_id'
    ])
    ->order([
        'id' => 'DESC'
    ]);

出于性能原因,我添加了sender_id和reciever_id的分组,因为我不想收到所有消息,但只找到我迄今为止写过的用户。

问题是group-statement会破坏排序。所以我想到了一个max-aggregate-function来保存订单。

但是我得到了cakephp框架的以下错误消息:

  

错误:SQLSTATE [42000]:语法错误或访问冲突:1064 SQL语法中有错误;检查与MySQL服务器版本相对应的手册,以便在MAX" MAX(`messages`__`max_date`)附近使用正确的语法,Messages.id AS`Messages__id`,Messages.sender_id A'在第1行

所以有人都知道,我的查询有什么问题?我尽力遵循文档中的示例。

为什么会说messages __ max_date而不是messagesmax_date

1 个答案:

答案 0 :(得分:0)

根本不是你如何定义计算字段和对应别名,这需要以key => value方式完成,即

'fields' => [
    'max_date' => 'MAX(`Messages`.`date_time`)',
    // ...
]

会导致像

这样的SQL片段
MAX(`Messages`.`date_time`) AS `max_date`

请参阅Cookbook > Database Access & ORM > Query Builder > Selecting Data

另外,作为提示,您可能希望使用表达式而不是简单字符串,以便CakePHP可以在需要时正确创建特定于平台的SQL。 MAX并未影响AFAIR,因此这只是一般性提示。

$query = $this->Messages->find();
$query
    ->select([
        'max_date' => $query->func()->max($this->Messages->aliasField('date_time'))
        // ...
    ])
    // ...

参见 Cookbook > Database Access & ORM > Query Builder > Using SQL Functions