在mysql中,我可以使用rand()函数,在SQLite3中是否有其他替代方法?
6kkfgxo01#
使用random():
SELECT foo FROM bar WHERE id >= (abs(random()) % (SELECT max(id) FROM bar)) LIMIT 1;
编辑(按qop):因为sqlite自动递增列上的文档说明:上面描述的普通rowid选择算法将生成单调递增的唯一rowid,只要您从不使用最大rowid值并且从不删除表中具有最大rowid的条目。如果删除了行,则在创建新行时可能会重用以前删除的行中的rowid。只有当你没有 INTEGER PRIMARY KEY AUTOINCREMENT 列(它仍然可以与 INTEGER PRIMARY KEY 列)。无论如何,这应该更便于携带/更可靠:
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的所有别名。
f45qwnt82#
SELECT * FROM table ORDER BY RANDOM() LIMIT 1;
ep6jt1vc3#
解决了的:
xjreopfe4#
为了获得更好的性能,请在sqlite中使用此选项:
SELECT * FROM table WHERE id IN (SELECT id FROM table ORDER BY RANDOM() LIMIT x)
这也适用于mysql。这运行得更快,因为sql引擎首先将行的投影字段加载到内存中,然后对它们进行排序,在这里,我们只需加载行的id字段并对其进行随机排序,然后得到其中的x,并找到这些x id的整行,默认情况下,这些id都已编入索引。
4条答案
按热度按时间6kkfgxo01#
使用random():
编辑(按qop):因为sqlite自动递增列上的文档说明:
上面描述的普通rowid选择算法将生成单调递增的唯一rowid,只要您从不使用最大rowid值并且从不删除表中具有最大rowid的条目。如果删除了行,则在创建新行时可能会重用以前删除的行中的rowid。
只有当你没有
INTEGER PRIMARY KEY AUTOINCREMENT
列(它仍然可以与INTEGER PRIMARY KEY
列)。无论如何,这应该更便于携带/更可靠:f45qwnt82#
ep6jt1vc3#
解决了的:
xjreopfe4#
为了获得更好的性能,请在sqlite中使用此选项:
这也适用于mysql。这运行得更快,因为sql引擎首先将行的投影字段加载到内存中,然后对它们进行排序,在这里,我们只需加载行的id字段并对其进行随机排序,然后得到其中的x,并找到这些x id的整行,默认情况下,这些id都已编入索引。