sqlite-order by rand()

mi7gmzs6  于 2021-08-09  发布在  Java
关注(0)|答案(4)|浏览(364)

在mysql中,我可以使用rand()函数,在SQLite3中是否有其他替代方法?

6kkfgxo0

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 列)。无论如何,这应该更便于携带/更可靠:

SELECT foo FROM bar
  WHERE _ROWID_ >= (abs(random()) % (SELECT max(_ROWID_) FROM bar))
LIMIT 1;
``` `ROWID` ,  `_ROWID_` 以及 `OID` 是sqlite内部行id的所有别名。
f45qwnt8

f45qwnt82#

SELECT * FROM table ORDER BY RANDOM() LIMIT 1;
ep6jt1vc

ep6jt1vc3#

解决了的:

SELECT * FROM table ORDER BY RANDOM() LIMIT 1;
xjreopfe

xjreopfe4#

为了获得更好的性能,请在sqlite中使用此选项:

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

这也适用于mysql。这运行得更快,因为sql引擎首先将行的投影字段加载到内存中,然后对它们进行排序,在这里,我们只需加载行的id字段并对其进行随机排序,然后得到其中的x,并找到这些x id的整行,默认情况下,这些id都已编入索引。

相关问题