Cakephp使用groupby并获得最高ID

时间:2011-11-17 21:13:05

标签: php sql cakephp group-by

我正在使用下面的查询来获取receiver_id的唯一结果,但也试图获得仅返回最高的id而不是最低的id,这是查找以下查询生成的内容。有没有办法我们可以更改find​​可选参数以获得仅返回的最高ID?

$this->loadModel('Chat');
        $lastChat = $this->Chat->find('all', array(
            'conditions' => array(
                'Chat.user_id' => $user_id['User']['id']
            ),
            'order' => array('Chat.id DESC'),
            'fields' => array(
                'Chat.id',
                'Chat.chat',
                'Chat.user_id',
                'Chat.receiver_id',
                'Chat.read',    
                'Chat.created'
            ),
            'group' => array('Chat.receiver_id')
        ));

2 个答案:

答案 0 :(得分:2)

我想说如果要在GROUP BY子句中使用聚合函数,只在SQL中使用SELECT子句是有意义的。

也许我不理解你问题的性质,但这个查询对你有用吗?

SELECT Chat.receiver_id, MAX(Chat.id)
FROM chats Chat
WHERE Chat.id = X
GROUP BY Chat.receiver_id

如果是这种情况,您只需要在fields数组中添加额外的元素:

$this->Chat->find('all', array(
  'conditions' => ...,
  'order' => ...,
  'fields' => array(..., 'MAX(Chat.id) as max_id',...),
  'group' => ...,
);

答案 1 :(得分:1)

这是实现目标的一种方式。

$this->loadModel('Chat');
$lastChat = $this->Chat->find('all', array(
        'conditions' => array(
        'Chat.user_id' => $user_id['User']['id']
        ),
        'order' => array('Chat.id DESC'),
        'fields' => array(
            'Chat.id',
            'Chat.chat',
            'Chat.user_id',
            'Chat.receiver_id',
            'Chat.read',    
            'Chat.created'
        ),
        'order' => array('Chat.receiver_id DESC'),
        'limit' => 1
    ));

无需使用GROUP BY。只需使用ORDER BYLIMIT即可。