Mysql 靠近';的cakephp 3(My)SQL聚合函数max()语法错误;AS MAX(`users`\uuuu` date\u time`)AS`date`
我正在用CakePHP3开发一个社交应用程序 我现在正在处理Messaging函数。它以这种方式工作,在左侧显示用户,其中一个有对话,中间是对话。 我希望用户按上次消息日期排序。意思是,如果彼得是我最后一个写信给他的人,那么彼得应该出现在最上面,以此类推 我有以下疑问: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`
$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能够在需要时正确创建特定于平台的SQLMAX
在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。我仍然得到一个错误。所以我想问题不是保留关键字。