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

时间:2012-06-23 15:52:49

标签: cakephp find cakephp-2.0 distinct extract

我有一个让我疯狂的问题,我不得不承认我在CakePHP中没有经验。如本问题所述, Using DISTINCT in a CakePHP find function,以这种方式使用DISTINCT:

$this->Model->find('all', array('fields'=>'DISTINCT field_name'));

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

所以,我仍然想要返回特定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')
    )
?>

来源: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的答案仍然相关吗?

提前致谢!

3 个答案:

答案 0 :(得分:10)

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

答案 1 :(得分:5)

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

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

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

度过美好的一天

答案 2 :(得分:2)

CakePHP 3.X

要选择不同的字段,您可以使用distinct()方法:

// Results in SELECT DISTINCT country FROM a table...
$query = $articles->find();
$query->select(['country'])
    ->distinct(['country']);

CookBook Documentation