我有一个让我疯狂的问题,我不得不承认我在CakePHP中没有经验。如本问题所述, Using DISTINCT in a CakePHP find function,以这种方式使用DISTINCT:
$this->Model->find('all', array('fields'=>'DISTINCT field_name'));
不返回DISTINCT值,而是返回所有行。事实上,这里的DISTINCT完全没有意义,因为由于某种原因,CakePHP在SQL查询中添加TableName
。id
(为什么??我可以删除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的答案仍然相关吗?
提前致谢!
答案 0 :(得分:10)
是的,第二个片段是在CakePHP 2.x中执行SELECT DISTINCT
的正确方法。 User.name
对应于字段名称,在本例中对应name
表中的字段users
。 my_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']);