Mysql 靠近';的cakephp 3(My)SQL聚合函数max()语法错误;AS MAX(`users`\uuuu` date\u time`)AS`date`

Mysql 靠近';的cakephp 3(My)SQL聚合函数max()语法错误;AS MAX(`users`\uuuu` date\u time`)AS`date`,mysql,sql,cakephp,cakephp-3.x,Mysql,Sql,Cakephp,Cakephp 3.x,我正在用CakePHP3开发一个社交应用程序 我现在正在处理Messaging函数。它以这种方式工作,在左侧显示用户,其中一个有对话,中间是对话。 我希望用户按上次消息日期排序。意思是,如果彼得是我最后一个写信给他的人,那么彼得应该出现在最上面,以此类推 我有以下疑问: $query = $this->Messages ->find('all', [ 'fields' => [ 'MAX(`messages`.`max_date`

我正在用CakePHP3开发一个社交应用程序

我现在正在处理Messaging函数。它以这种方式工作,在左侧显示用户,其中一个有对话,中间是对话。 我希望用户按上次消息日期排序。意思是,如果彼得是我最后一个写信给他的人,那么彼得应该出现在最上面,以此类推

我有以下疑问:

$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'
    ]);
出于性能方面的考虑,我添加了一个按发送者id和接收者id的分组,因为我不想接收所有消息,而只想查找到目前为止使用的用户

问题是group语句会破坏排序。所以我考虑了一个最大聚集函数来保持顺序

但是,我通过cakephp框架得到以下错误消息:

错误:SQLSTATE[42000]:语法错误或访问冲突:1064您的SQL语法有错误;检查与您的MySQL服务器版本对应的手册,以了解在第1行的“MAX”(`messages`\uuu` MAX\u date`)、messages.id为`messages\uu id`、messages.sender\u id A'附近使用的正确语法

有人知道我的问题出在哪里吗?我尽了最大努力来遵循文档中的示例


为什么它会说
messages
\ucode>max\u date而不是
messages
max\u date

这根本不是定义计算字段和对应别名的方式,这需要以
键=>值的方式来完成,即

'fields' => [
    'max_date' => 'MAX(`Messages`.`date_time`)',
    // ...
]
这将导致一个SQL片段,如

MAX(`Messages`.`date_time`) AS `max_date`

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

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

请参阅

不完全确定,因为我不太熟悉
mysql
,但我认为
date
是一个保留关键字。请查看编辑。因此,我删除了AS date,并将其重命名为mysql中的列,从date\u time改为max\u date。我仍然得到一个错误。所以我想问题不是保留关键字。