web-dev-qa-db-ja.com

CakePHP 2.1-find()でDISTINCTを適切に使用する方法

私は私を夢中にさせている質問があります、そして私は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の答えはまだ関連していますか?

前もって感謝します!

11
alieninlondon

はい、2番目のスニペットはCakePHP2.xでSELECT DISTINCTを実行する正しい方法です。 User.nameはフィールド名に対応し、この場合はnameテーブルのフィールドusersに対応します。 my_column_nameは、結果セットのフィールド名の(オプションの)エイリアスです。つまり、nameの代わりに、フィールドの名前は結果セットのmy_column_nameになります。

10
dhofstet

条件付き検索でdistinctを使用する正しい方法は次のとおりです。

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

ここで、$ valには、クエリで渡す値が含まれています。

ごきげんよう

6
user1720419

_CakePHP 3.X_の場合

個別のフィールドを選択するには、distinct()メソッドを使用できます。

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

CookBookドキュメント

2
Faisal