【问题标题】:CakePHP 2.1 - How to properly use DISTINCT in find()CakePHP 2.1 - 如何在 find() 中正确使用 DISTINCT
【发布时间】:2012-06-23 15:52:48
【问题描述】:

我有一个让我发疯的问题,我不得不承认我在 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 我的 field_name?

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

提前致谢!

【问题讨论】:

    标签: cakephp find cakephp-2.0 distinct extract


    【解决方案1】:

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

    【讨论】:

    • 感谢您的回答。但是,使用 $regions = $this-&gt;Provider-&gt;find('all', array ('fields' =&gt; array('DISTINCT (provider.region) AS region')));$regions = $this-&gt;Provider-&gt;find('all', array ('fields' =&gt; array('DISTINCT (provider.region)'))); 它不会选择唯一条目。相反,所有不是 DISTINCT 且不是我想要的行。生成的 SQL 查询:SELECT DISTINCT (provider.region), Provider.id` FROM carecrowd.providers AS Provider WHERE 1 = 1`。我是否以某种方式误解了你,我的代码不正确?
    • 生成的SQL查询不正确,查询中应该没有Provider.id。您使用哪个 CakePHP 版本?以及哪个数据库?至少使用 CakePHP 2.1.3 和 MySQL 会生成正确的查询。
    • 感谢您的回复。我有 CakePHP 2.1.3 和 MySQL。所以这不是问题。然而,你的回复让我想到了除了语法错误之外的其他事情,但与模型有关。事实证明,问题在于我已经为 Provider 模型建立了模型关联,没有模型关联,上述语法可以正常工作。所以 Cake 自动将Provider.id 添加到 SQL 查询中,它应该是这样还是一个错误?我在问,因为模型关联有效地阻止了相关模型的 DISTINCT 查找查询。或者我错过了什么?
    • 是的,CakePHP 自动从相关模型中检索数据。为避免这种情况,您必须在选项数组中为查找指定 'recursive' =&gt; -1(或使用可包含行为)。
    • 这是在谷歌上首先显示搜索这个问题所以我只是想添加一些东西来帮助其他人:如果你正在做一个 find('list') 那么 Cake 将保留 Model.id即使您使用递归 = -1。 stackoverflow.com/a/1718614/794458 建议使用另一种在 Cake 中删除重复项的方法
    【解决方案2】:

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

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

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

    祝你有美好的一天

    【讨论】:

      【解决方案3】:

      对于CakePHP 3.X

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

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

      CookBook Documentation

      【讨论】:

      • 为我生成一个 GROUP BY,而不是 DISTINCT (Cake 3.5)
      猜你喜欢
      • 2016-12-14
      • 2013-05-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多