質問: $this->find('all',array( 'fields' => array('DISTINCT name'), 'limit' => 5, 'order' => 'created DESC' ) ); return $result; } ``` nameフィールドには、 例) りんご 2016/1/1 ぶどう 2016/1/31 みかん 2016/2/3 ばなな 2016/3/6 りんご 2016/3/10 ぶどう 2016/4/1 めろん 2016/4/5 のようなデータが入っています。 DISTINCTで重複を除外し、上記のコードのように実行すると、 【実行結果】 りんご 2016/1/1 ぶどう 2016/1/31 みかん 2016/2/3 ばなな 2016/3/6 めろん 2016/4/5 このように重複しているデータに関しては古いほうが優先されて残ってしまい、 新しい日付の りんご 2016/3/10 ぶどう 2016/4/1 を取得出来ません。 【理想の実行結果】 みかん 2016/2/3 ばなな 2016/3/6 りんご 2016/3/10 ぶどう 2016/4/1 めろん 2016/4/5 このようにするにはどうすればよいでしょうか。 何か、方法がありましたら、ご教授頂けませんでしょうか。 もしくは、下記のような、要素がいくつあるか分からない配列すべてをforeachを使ってechoする方法でも構いません。 ``` //$hoge array( [0] => 'みかん', [1] => 'りんご', [2] => 'ばなな', [3] => 'めろん', [4] => 'ぶどう' : : : ); //どのように指定すればすべて表示できるか・・・? foreach($hoge as $row){ echo $row???? } ``` よろしくお願い致します。
回答: SQLで言うところのgroup by 区を使うことで実現可能です。 SQLでは以下のように書きます。 nameごとにcreatedの一番新しいものが返ってきます。 ``` select name, MAX(created) as created from table_name group by name; ``` CakePHPでは以下のようになるかと思います。 ``` $result = $this->find('all',array( 'fields' => array('name', 'MAX(created) as created'), 'group' => 'name' ) ); ``` CakePHPのgroup by のサンプルは以下のページにありますので、 参考になさってみてください。 データを取得する - CakePHP Cookbook 2.x ドキュメント ページ内検索で"group by"をキーワードに検索するとすぐに見つかります。