質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

CakePHP

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

Q&A

解決済

1回答

557閲覧

findで重複チェックしつつ、modifiedが最新のものを取ってきたい

momolength

総合スコア62

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

CakePHP

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

0グッド

0クリップ

投稿2021/06/11 07:26

編集2021/06/11 11:03

下記を実行すると、

$this->TestTable->find('all', array( 'fields' => array( 'TestTable.name', 'TestTable.modified', ), // 'group' => array('TestTable.name'), 'order' => array('TestTable.modified DESC') ));

結果はこんな感じになります。

array(3) { [0]=> array(1) { ["TestTable"]=> array(2) { ["name"]=> string(6) "orange" ["modified"]=> string(19) "2021-06-11 10:05:00" } [1]=> array(1) { ["TestTable"]=> array(2) { ["name"]=> string(5) "budou" ["modified"]=> string(19) "2021-06-11 10:02:00" } [2]=> array(1) { ["TestTable"]=> array(2) { ["name"]=> string(4) "budou" ["modified"]=> string(19) "2021-06-11 10:01:00" } }

このnameが重複しているものを弾きつつ、中でもmodifiedが新しいものを取得したい。

つまり、

["name"]=> string(6) "orange" ["modified"]=> string(19) "2021-06-11 10:05:00"


["name"]=>
string(5) "budou"
["modified"]=>
string(19) "2021-06-11 10:02:00"
のみ。

それ以前(10:01:00以下)にnameがbudouのものがあったとしても取得しないようにしたい。

ここで、orderを入れたがなぜか最新のものと最古のものが取得された。
つまり、
["name"]=>
string(6) "orange"
["modified"]=>
string(19) "2021-06-11 10:05:00"

["name"]=>
string(4) "budou"
["modified"]=>
string(19) "2021-06-11 10:01:00"

どう記述しなおすべき?findは諦めて全件取得後弾くべき?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

CakePHPというよりも、SQLの考え方の問題かと思います
日付型の最新(一番大きいもの)を取得するには MAX を使えばよいです
そのため、おそらくは以下のコードで目的は達成できると思います

$this->TestTable->find('all', array( 'fields' => array( 'TestTable.name', 'MAX(TestTable.modified) AS max_modified', ), 'group' => array('TestTable.name'), ));

※元のコードからCakePHP2系と思われたので2系の書き方をしてます
公式ドキュメントは https://book.cakephp.org/2/ja/models/retrieving-your-data.html を参照してください

投稿2021/06/21 12:16

ops

総合スコア9

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

momolength

2021/06/22 00:46

>元のコードからCakePHP2系と思われたので2系の書き方を 大変失礼しました。 ご丁寧にありがとうございます。 実はMAXを見つけてはいたんですが、書き方に苦戦しておりこれでスッキリしました。as句を使えば短く名前も設定できますね。 とても助かりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問