在 MySQL 中我可以使用 RAND() 函数,在 SQLite 3 中是否有任何替代方法?
问问题
53337 次
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 回答