CakePHP 2.1 - 如何在find()中正确使用DISTINCT

ali*_*don 11 cakephp extract distinct find cakephp-2.0

我有一个让我疯狂的问题,我不得不承认我在CakePHP中没有经验.正如在这个问题中提到的, 在CakePHP查找函数中使用DISTINCT,这样使用DISTINCT:

$this->Model->find('all', array('fields'=>'DISTINCT field_name'));
Run Code Online (Sandbox Code Playgroud)

不返回DISTINCT值,而是返回所有行.事实上,这里的DISTINCT完全没有意义,因为由于某种原因,CakePHP补充道TableName.id在SQL查询中(为什么??我可以删除id引用??),有效地返回每个DISTINCT主键(= all rows = unhelpful).

所以,我仍然想要返回特定field_name列的DISTINCT值.我不能只使用find('all')或find('list')函数吗?是否真的是使用上面链接中描述的Set :: extract()函数来实现它的正确方法?这似乎是CakePHP过度间接的解决方案,通常Cake会让我的生活更轻松.:-)将find和DISTINCT一起使用的正确方法是什么?也许DISTINCT不适用于find()?

看看CookBook,他们说:"做一个DISTINCT查询的快速例子.你可以用类似的方式使用其他运算符,如MIN(),MAX()等:"

<?php
    array(
        'fields' => array('DISTINCT (User.name) AS my_column_name'),
        'order' = >array('User.id DESC')
    )
?>
Run Code Online (Sandbox Code Playgroud)

资料来源:http://book.cakephp.org/2.0/en/models/retrieving-your-data.html

这表明DISTINCT应该可以使用,但是这里有什么用呢?(User.name)对应于我想要DISTINCT的field_name还是my_column_name my field_name?

最后,从CakePHP 1.x迁移到CakePHP 2.x时,是否有任何改变?即在Stackoverflow上看到的CakePHP 1.x的答案仍然相关吗?

提前致谢!

dho*_*tet 10

是的,第二个片段是SELECT DISTINCT在CakePHP 2.x中执行a的正确方法.User.name对应于字段名称,在本例中对应nameusers表中的字段.my_column_name是结果集中字段名称的(可选)别名,name即将my_column_name在结果集中命名字段而不是字段.

  • 这首先在Google上显示搜索此问题所以我只是想添加一些内容来帮助其他人:如果你正在进行查找('list'),那么即使你使用recursive = -1,Cake也会保留Model.id .http://stackoverflow.com/a/1718614/794458建议在Cake中删除重复项的另一种方法 (2认同)

小智 6

在条件查找中使用distinct的正确方法是:

$this->Model->find('all', array('fields' => array('DISTINCT Model.database_fieldname'),'conditions' => array('Model.database_fieldname' =>$val )));
Run Code Online (Sandbox Code Playgroud)

其中$ val包含您要在查询中传递的值.

祝你今天愉快