私は私を夢中にさせている質問があります、そして私はCakePHPでそれほど経験がないことを認めなければなりません。この質問で述べたように、 CakePHP検索関数でDISTINCTを使用 、次のように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/retrieveing-your-data.html
これは、DISTINCTを使用できるはずであることを示していますが、ここでは何ですか? (User.name)は、DISTINCTが必要なfield_nameに対応していますか、それともmy_column_nameは私のfield_nameですか?
最後に、CakePHP1.xからCakePHP2.xに移行するときに、これは変更されましたか?つまり、Stackoverflowで見られるCakePHP 1.xの答えはまだ関連していますか?
前もって感謝します!
はい、2番目のスニペットはCakePHP2.xでSELECT DISTINCT
を実行する正しい方法です。 User.name
はフィールド名に対応し、この場合はname
テーブルのフィールドusers
に対応します。 my_column_name
は、結果セットのフィールド名の(オプションの)エイリアスです。つまり、name
の代わりに、フィールドの名前は結果セットのmy_column_name
になります。
条件付き検索でdistinctを使用する正しい方法は次のとおりです。
$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']);
_