77

在 MySQL 中我可以使用 RAND() 函数,在 SQLite 3 中是否有任何替代方法?

4

4 回答 4

161
SELECT * FROM table ORDER BY RANDOM() LIMIT 1;
于 2009-08-10T07:43:16.580 回答
54

使用随机()

SELECT foo FROM bar
  WHERE id >= (abs(random()) % (SELECT max(id) FROM bar))
  LIMIT 1;

编辑(按 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 的别名。

于 2009-08-10T07:44:37.093 回答
43

解决了:

SELECT * FROM table ORDER BY RANDOM() LIMIT 1;
于 2009-08-10T07:42:03.883 回答
26

为了获得更好的性能,请在 SQLite 中使用:

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

这也适用于 MySQL。这运行得更快,因为SQL 引擎首先将行的投影字段加载到内存然后对其进行排序,这里我们只是加载并随机排序行的 id 字段,然后我们得到其中的 X 个,并找到这些 X id 的整行,即默认索引。

于 2014-07-06T00:31:14.633 回答