mysql - cakephp 3 (My)SQL 聚合函数 max() 语法错误靠近 'AS MAX(` 用户`_ _`date_time` ) AS `date`

标签 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 进行分组,因为我不想接收所有消息,而只想查找到目前为止我所写的用户。

问题在于组语句破坏了排序。所以我考虑了一个 max-aggregate-function 来保留顺序。

但是我从 cakephp 框架收到以下错误消息:

Error: SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'MAX(`messages`__`max_date`), Messages.id AS `Messages__id`, Messages.sender_id A' at line 1

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

为什么它说messages__max_date而不是messages.max_date

最佳答案

这根本不是定义计算字段和相应别名的方式,这需要以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

关于mysql - cakephp 3 (My)SQL 聚合函数 max() 语法错误靠近 'AS MAX(` 用户`_ _`date_time` ) AS `date`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34717590/

相关文章:

php - 删除数据库cakephp中的一条记录

php - CakePHP 无法连接到 Postgres。但是 Pgadmin4 可以

php - 我如何使用 CakePHP 的模型验证消息而不是 Controller 的 setFlash 消息?

php - 如何通过单击按钮来更新信息?

php - 确定查询在哪个页面上执行

sql - 返回 500 万条记录的查询需要多长时间?

mysql - 将一行变成多行

java - 数据库中的灵活搜索

php - 从不同的数据库表获取搜索结果并显示它们?

mysql - 单个字段上可靠的递减/递增所需的隔离级别