テーブルからランダムにデータを取り出す(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),
));
  • このエントリーをはてなブックマークに追加

関連記事

RSSフィードの取得

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

Formヘルパーのinputタグのdiv/labelなどの設定

Formヘルパーのinputではデフォルトでは以下のようにdivで囲われて、labelが付与されて出力されます。 CSSのフレームワークなどであらかじめ決まったスタイルがある場合に便利に作られていま

ログローテーション

CakePHP 2.xではbootstrap.php内にあらかじめアプリケーションログの設定が書かれています。2.xで日付ごとにログファイルが切り替わるよう設定してみました。 日ごとにログを切り替え

FormヘルパーのMagicOption (マジックオプション) 

Formヘルパーでは、「フィールド名」,「テーブルカラムのデータ型」もしくはモデルの「バリデーション設定」によりフォーム要素を決定したり、自動で属性を付与する「マジックオプション」と呼ばれるものがある

checkボックスを実装

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

入力文字列の長さ(文字数)をバリデーション

CakePHP 2には、コアバリデーションに文字列の長さを検証する関数が用意されています。 文字列長(コア)バリデーション minLength - 最小文字数以上であること maxLengt

アップロードファイルのバリデーションルール

CakePHP 2.2や2.3になってファイルアップロードに対するルールがコアバリデーションに追加されているようで、まとめてみました。 コアバリデーション 関連しそうなルールは以下の4つの

CakePHP インストール時エラーの対処

CakePHPインストール時に出くわすであろうエラーの原因と対処方法についてまとめてみました。前提として、WebサーバはApache、データベースはMySQLとしています。 Timezone未設

Cookieログイン

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

no image

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

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

Comment

Message

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

*

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

    PAGE TOP ↑