これが状況です。バックエンドとして MySQL と MSSQL の両方と互換性のある Zend_Framework で記述されたアプリケーションがあります。現在、ZF は 2 つの言語間の多くの SQL の不一致/相違点を解決するのに非常に優れていますが、私はまだこれを理解する必要があります。
目的は、テーブルから 1 つのランダムなレコードを選択することです。これは非常に単純なステートメントです。
たとえば、select ステートメントを次に示します。
$sql = $db->select()
->from("table")
->order("rand()")
->limit(1);
MySQL の sql は次のとおりであるため、これは MySQL データベース テーブルに対して完全に機能します。
SELECT `table`.* FROM `table` ORDER BY rand() ASC
一方、MSSQL はnewid()関数を使用してランダム化を行います。
適切な順序付けを使用する必要があることを認識させるために、 order()関数に渡すことができるヘルパーのようなものはありますか? 私はドキュメントを検索し、zfforums でいくつかのヒントを見つけましたが、確実なものは何もありませんでした。
私が見つけたものの1つは次のとおりです。
ORDER BY RANDOM() が機能しない- ZFForums.com
彼らは以下を使用しています:
$res = $db->fetchAll(
'SELECT * FROM table ORDER BY :random',
array('random' => new Zend_Db_Expr('RANDOM()')
);
それは機能します...しかし、私は選択ステートメントを入力して文字列を置換することで作成するつもりはありません。同じZend_Db_Selectオブジェクトに保持しようとしています。また、ステートメントに を渡そうとしましたが、失敗しZend_Db_Expr('RANDOM()')
ます。->order()
彼は答えを見つけるための理論的な解決策も投稿していますが、私は $db->fetch() 呼び出しを変更して、これが含まれている関数を書き直すつもりはありません。
何か案は?