CakePHP2.1-如何在find()中正确使用DISTINCT

CakePHP2.1-如何在find()中正确使用DISTINCT,cakephp,find,cakephp-2.0,distinct,extract,Cakephp,Find,Cakephp 2.0,Distinct,Extract,我有一个让我发疯的问题,我必须承认我在CakePHP方面没有那么丰富的经验。如问题所述,, ,使用这种方式: $this->Model->find('all', array('fields'=>'DISTINCT field_name')); 不返回不同的值,而是返回所有行。事实上,这里的DISTINCT完全没有意义,因为出于某种原因,CakePHP在SQL查询中添加了TableNameid(为什么?我可以删除id引用??),有效地返回每个不同的主键(=all rows=un

我有一个让我发疯的问题,我必须承认我在CakePHP方面没有那么丰富的经验。如问题所述,, ,使用这种方式:

$this->Model->find('all', array('fields'=>'DISTINCT field_name'));
不返回不同的值,而是返回所有行。事实上,这里的DISTINCT完全没有意义,因为出于某种原因,CakePHP在SQL查询中添加了
TableName
id
(为什么?我可以删除id引用??),有效地返回每个不同的主键(=all rows=unhelp)

因此,我仍然希望返回特定字段名称列的不同值。我能不能只使用find('all')或find('list')函数?使用上面链接中描述的Set::extract()函数真的是正确的方法吗?这似乎是CakePHP过于间接的解决方案,通常蛋糕会让我的生活更轻松。:-)使用find和DISTINCT的正确方法是什么?可能DISTINCT对find()不起作用

看着烹饪书,他们说:“这是一个执行不同查询的快速示例。您可以以类似的方式使用其他运算符,如MIN()、MAX()等:”


资料来源:

这表明应该可以使用DISTINCT,但这里是什么?(User.name)是否对应于我想要区分的字段名称,或者我的列名称是否对应于我的字段名称

最后,从cakephp1.x迁移到cakephp2.x时,这一切都发生了变化吗?Ie在Stackoverflow上看到的CakePHP 1.x的答案是否仍然相关


提前谢谢

是的,第二个代码片段是在CakePHP 2.x中执行
选择DISTINCT
的正确方法
User.name
对应于字段名,在本例中对应于
users
表中的字段
name
my_column\u name
是结果集中字段名的(可选)别名,即,字段将在结果集中命名为
my_column\u name

使用distinct in find with CONDICTION的正确方法是:

$this->Model->find('all', array('fields' => array('DISTINCT Model.database_fieldname'),'conditions' => array('Model.database_fieldname' =>$val )));
其中$val包含要在查询中传递的某个值


祝您有愉快的一天

CakePHP 3.X

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

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

谢谢你的回答。但是,使用
$regions=$this->Provider->find('all',array('fields'=>array('DISTINCT(Provider.region)AS region'))
$regions=$this->Provider->find('all',array('fields'=>array('DISTINCT(Provider.region))它不会拾取唯一的条目。取而代之的是所有不清晰的行,它们不是我想要的。结果SQL查询:
选择DISTINCT(
provider
region
),
provider
id`FROM
carecrowd
providers
AS
provider
其中1=1`。我是否有点误解您的意思,我的代码是否不正确?生成的SQL查询不正确,查询中应该没有
Provider.id
。您使用哪个CakePHP版本?哪个数据库?至少使用CakePHP 2.1.3和MySQL生成了正确的查询。感谢您的回复。我有CakePHP2.1.3和MySQL。所以这不是问题所在。然而,您的回答让我想到了除了错误语法之外的其他事情,但与模型有关。事实证明,问题是我已经为提供者模型建立了模型关联,没有模型关联,上述语法可以正常工作。因此,Cake将
Provider.id
自动添加到SQL查询中,这应该是这样还是一个bug?我这样问是因为模型关联有效地阻止了对相关模型的独特查找查询。或者我遗漏了什么?是的,CakePHP自动从相关模型检索数据。为了避免这种情况,您必须在选项数组中为查找指定
'recursive'=>-1
(或使用可包含的行为)。这是Google上首先显示的搜索此问题,因此我只想添加一些帮助其他人的内容:如果您正在查找('list'),那么即使使用recursive=-1,Cake也会保留Model.id。在为我生成一个组时,建议使用另一种方法来删除Cake中的重复项,但不明确(Cake 3.5)
// Results in SELECT DISTINCT country FROM a table...
$query = $articles->find();
$query->select(['country'])
    ->distinct(['country']);