web-dev-qa-db-ja.com

SQLite-ORDER BY Rand()

MySQLではRand()関数を使用できますが、SQLite 3に代替手段はありますか?

64
Alix Axel

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のエイリアスです。

49
dfa
SELECT * FROM table ORDER BY RANDOM() LIMIT 1;
126
avnic

解決済み:

SELECT * FROM table ORDER BY RANDOM() LIMIT 1;
35
Alix Axel

SQLiteでこれを使用するとパフォーマンスが大幅に向上します:

SELECT * FROM table WHERE id IN (SELECT id FROM table ORDER BY RANDOM() LIMIT x) 

これはMySQLにも適用されます。 SQLエンジンが最初に行の投影フィールドをメモリにロードしてから並べ替える、ここでは行のidフィールドをロードしてランダムに並べ替え、次にそれらのXを取得して行全体を検索するため、これはより高速に実行されますこれらのX idのうち、デフォルトでインデックス付けされているもの。

13
Ali