11

我有一个让我发疯的问题,我不得不承认我在 CakePHP 方面没有那么有经验。正如这个问题中提到的, 在 CakePHP 中使用 DISTINCT 查找函数,以这种方式使用 DISTINCT:

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

不返回 DISTINCT 值,而是返回所有行。事实上,这里的 DISTINCT 完全没有意义,因为出于某种原因,CakePHP 添加了TableName. id在 SQL 查询中(为什么??我可以删除 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 我的 field_name?

最后,当从 CakePHP 1.x 迁移到 CakePHP 2.x 时,这是否发生了任何变化?即在 Stackoverflow 上看到的 CakePHP 1.x 的答案是否仍然相关?

提前致谢!

4

3 回答 3

10

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

于 2012-06-24T12:40:57.970 回答
7

在 find with condition 中使用 distinct 的正确方法是:

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

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

祝你今天过得愉快

于 2012-10-31T07:05:35.560 回答
2

为了CakePHP 3.X

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

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

食谱文档

于 2017-05-02T10:44:12.890 回答