MySQLではRand()関数を使用できますが、SQLite 3に代替手段はありますか?
random() を使用:
SELECT foo FROM bar
WHERE id >= (abs(random()) % (SELECT max(id) FROM bar))
LIMIT 1;
EDIT(by QOP):SQLite Autoincrement ed列のドキュメントには次のように記載されているため:
上記の通常のROWID選択アルゴリズムは、最大ROWID値を使用せず、最大ROWIDを持つテーブルのエントリを削除しない限り、単調に増加する一意のROWIDを生成します。 行を削除すると、新しい行を作成するときに以前に削除した行のROWIDが再利用される可能性があります。
上記は、INTEGER PRIMARY KEY AUTOINCREMENT
列がない場合にのみ当てはまります(INTEGER PRIMARY KEY
列でも引き続き機能します)。とにかく、これはより移植性/信頼性が高いはずです:
SELECT foo FROM bar
WHERE _ROWID_ >= (abs(random()) % (SELECT max(_ROWID_) FROM bar))
LIMIT 1;
ROWID
、_ROWID_
、およびOID
はすべて、SQLite内部行IDのエイリアスです。
SELECT * FROM table ORDER BY RANDOM() LIMIT 1;
解決済み:
SELECT * FROM table ORDER BY RANDOM() LIMIT 1;
SQLiteでこれを使用するとパフォーマンスが大幅に向上します:
SELECT * FROM table WHERE id IN (SELECT id FROM table ORDER BY RANDOM() LIMIT x)
これはMySQLにも適用されます。 SQLエンジンが最初に行の投影フィールドをメモリにロードしてから並べ替える、ここでは行のidフィールドをロードしてランダムに並べ替え、次にそれらのXを取得して行全体を検索するため、これはより高速に実行されますこれらのX idのうち、デフォルトでインデックス付けされているもの。