テーブルからランダムにデータを取り出す(find)

CakePHPでテーブルから特定件数のレコードをランダムに取得するには以下のように指定するとできます。

$this->data = $this->Bulkdata->find( 'all', array(
    'order' => 'rand()',    // ORDER BY RAND()
    'limit' => 5            // 5件取得
));

件数が多い場合は、フィールドを指定するとその分処理が速くなります。

$this->data = $this->Bulkdata->find( 'all', array(
    'fields' => array( 'data'),    // dataカラムのみ取得
    'order' => 'rand()',
    'limit' => 5
));

大量レコードの場合

ORDER BY RAND()では、全件取得してから、それをランダムに並べ替えます。
レコード件数増になるつれ、徐々にクエリに時間がかかるようになります。
その対処としては、まずインデックスされたカラムからランダムに取得し、それをキーに必要件数分のみ取得するようにすると処理が速くなります。

// ランダムなidを必要件数取得
$ids = $this->Bulkdata->find( 'list', array(
    'fields' => 'id',
    'order' => 'RAND()',
    'limit' => 5)
);
// 取得したidで条件検索
$this->data = $this->Bulkdata->find( 'all', array( 
    'fields' => array( 
        'Bulkdata.data'
    ),
    'conditions' => array( 'Bulkdata.id' => $ids),
));
  • このエントリーをはてなブックマークに追加

関連記事

no image

HttpSocketを使用してリクエスト送信

CakePHPには、Webサービスへのリクエスト送信のためのHttpSocketクラスが用意されています。 HttpSocket get HTTP GETリクエストを発行します。デモ H

checkボックスを実装

selectボックスに引き続いてcheckボックスの実装方法をおさらいしてみます。 コードは、CakePHP 2と1.3両方で実装可能です。デモ モデルは、こちらも以下 CREATE TA

ネストしたリストを出力「nestedList」

DBやJSONからデータを取得して、そのデータをもとにメニュー表示などネストしたリストを出力させたい場合に「nestedList」が便利です。 ヘルパーに渡すデータは連想配列である必要があります。(

バリデーションエラーメッセージの取得

CakePHP 2.xになってバリデーションエラー時に返却されるメッセージのデータ形式が変更になったようです。1.3系では、ひとつのフィールドに対して返却されるメッセージは一つのルールのみですが、2.

日付・時間のバリデーション

日付や時刻に関するバリデーションは以下のルールがビルトインされています。 date 日付 time 時刻 datetime 日時 (m:「月」を数字表記 / M:「月」を英語表記)

Cookieログイン

今回は、ログイン画面でよくみかけるクッキーログインの機能を使ってみます。 CakePHPには、Cookieコンポーネントがあります。(PHPのsetcookieメソッドのラッパー)メソッドはwr

数値系バリデーション

CakePHP 2になっていくつか数値用バリデーションルールが追加されています。 数値用 (コア)バリデーション decimal - 十進数であること numeric - 数値であること

RSSフィードの取得

コンロトーラ public function getrssfeed() { try { $newsItems = $this->Rss->read( 'http://

CakeEmailでメール送信(@gmail)

CakePHP 2になって追加されたクラスCakeEmailがシンプルに使えます。これを使用してメール送信を行う処理を実装してみました。 CakeEmailクラスの読み込み /app/Config

Blowfishを使用してハッシュ化する

使用方法 Blowfishを採用してハッシュ化を行う場合、Securityクラスのhashメソッドを呼び出します。第2引数に'blowfish'を指定し、第3引数を指定しないもしくはfalseにしま

Comment

Message

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

*

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

    PAGE TOP ↑