2012-06-23 48 views
8

我有一個問題讓我瘋狂,我不得不承認我沒有CakePHP的經驗。由於在這個問題上, Using DISTINCT in a CakePHP find function提到,使用DISTINCT這樣:CakePHP 2.1 - 如何在find中正確使用DISTINCT()

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

不會返回不同的值,而是返回所有行。事實上,這裏的DISTINCT完全沒有意義,因爲CakePHP出於某種原因增加了TableName。 (爲什麼我可以刪除id引用?),有效地返回每個DISTINCT主鍵(= all rows = unhelpful)。

因此,我仍然想要返回特定field_name列的DISTINCT值。我可以不使用find('all')或find('list')函數嗎?使用上面鏈接中描述的Set :: extract()函數是否真的是正確的方法?這似乎是CakePHP的一個非常間接的解決方案,通常Cake會讓我的生活更輕鬆。 :-)一起使用find和DISTINCT的正確方法是什麼?也許DISTINCT不適用於find()?

看着菜譜,他們說:「做一個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)對應於field_name我想要DISTINCT for或是my_column_name我的field_name?

最後,從CakePHP 1.x遷移到CakePHP 2.x時,是否有任何更改?即在CakePHP 1.x上看到的Stackoverflow的答案仍然相關?

在此先感謝!

回答

9

是的,第二個片段是在CakePHP 2.x中執行SELECT DISTINCT的正確方法。 User.name對應於字段名稱,在本例中對應於users表中的字段namemy_column_name是結果集中字段名稱的一個(可選)別名,即,而不是name該字段在結果集中將被命名爲my_column_name

+1

感謝您的回答。然而,使用'$ regions = $ this-> Provider-> find('all',array('fields'=> array('DISTINCT(provider.region)AS region'));'或'$ regions = $ this-> Provider-> find('all',array('fields'=> array('DISTINCT(provider.region)')));'它沒有選擇唯一的條目。相反,所有不是DISTINCT的行並不是我想要的。由此產生的SQL查詢:'SELECT DISTINCT('provider'.'region'),'Provider'.'id' FROM'carecrowd'.'providers' AS''Provider' WHERE 1 = 1'。我是否以某種方式誤解了你,並且是我的代碼不正確? – alieninlondon

+0

生成的SQL查詢不正確,查詢中應該沒有'Provider.id'。你使用哪個CakePHP版本?和哪個數據庫?至少在CakePHP 2.1.3和MySQL中會生成正確的查詢。 – dhofstet

+0

感謝您的回覆。我有CakePHP 2.1.3和MySQL。所以這不是問題。但是,您的回覆讓我思考其他問題,而不是錯誤的語法,但與模型有關。事實證明,問題在於我爲Provider模型建立了模型關聯,沒有模型關聯,上面的語法工作正常。所以Cake將'Provider.id'自動添加到SQL查詢中,它應該是這樣或者是一個錯誤?我在問,因爲模型關聯有效地阻止了相關模型的DISTINCT查找查詢。或者我錯過了什麼? – alieninlondon

5

中發現使用不同與病情的正確的方法是:

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

其中$ VAL包含要在查詢中通過一定的價值。

擁有美好的一天

1

對於CakePHP 3.X

要選擇不同的領域,你可以使用distinct()方法:

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

CookBook Documentation

+0

爲我生成GROUP BY,而不是DISTINCT(Cake 3.5) – Davorin