2012-10-17 83 views
0

我有一个MySQL表3列(thread_id,message_id,message)。沿着link中“使用GROUP BY的示例”中找到的解决方案的线路,我希望查询GROUP BY thread_id,但返回每个thread_id的最高message_id(而不是默认最低)的行。然后,我想要一个格式良好的数组,其中包含行/项目,就像您在CakePHP中寻找操作不太复杂的查找操作一样,其行数为$array[index]['Model']['field']。使用以下CakePHP语法:CakePHP&MySQL - 使用查找('所有')与GROUP为一个字段和MAX为另一个字段

$this->Model->find('all', array(
    'fields' => array('MAX(Model.message_id) as message_id', 'Model.thread_id', 'Model.message'), 
    'group => 'Model.thread_id' 
)); 

现在,不幸的是我没有得到这个很好格式化的数组。相反,我得到一个如下所示的数组:

Array([0] => Array([0] => Array([message_id] => wanted/correct_message_id)[Model] => Array([message] = >从最低/不需要MESSAGE_ID线消息。[thread_id单] =>密钥从最低/不需要MESSAGE_ID线))

为什么message_id得不到钩到所述阵列的所述[Model]部分和为什么CakePHP的取最低message_id线并且将messagethread_id放入没有message_id列的阵列的[Model]部分中?

I希望数组中的[Model]部分中的所有列都有,并且我希望该行按照我的初始描述为该thread_id的最高message_id。希望这个问题有道理。

+0

为了将它放入模型键中,将其设置为'virtualField'。 – tigrang

+0

好的。将所需的行(最高)提取到模型密钥中? – alieninlondon

回答

1

虚拟领域对于这类事情真的很有用。

class MyModel extends AppModel { 

    public $virtualFields = array(
     'max_message_id' => 'MAX(MyModel.message_id)' 
    ); 

} 

您现在可以使用max_message_id就好像它是在你的表中的普通区,这样你就可以把它添加到您的查找操作。

+0

好有意思。 SQL查询将与上面的示例不同吗?在这种情况下,虚拟域使默认查询总是找到最高的message_id行而不是最低的(就像我想要的那样)? – alieninlondon

+0

所有'$ virtualFields'都允许您像您所做的那样编写自定义SQL,但将结果拉入关联数组中,就好像它是一个真正的表字段。否则,它应该以完全相同的方式表现。如果你不总是想使用它,你也可以在调用find()之前设置模型的'$ virtualFields'的值。 –

+0

@ user1469742虚拟字段不会影响您的正常查询,所以如果您想查找正常的message_id,您会发现'message_id',但是如果您想查找最大的消息ID,则可以使用'max_message_id'。 – BadHorsie

相关问题