在mySQL中,我可以使用rand()函数,在sqlite 3中是否有其他选择?

有帮助吗?

解决方案

使用 随机的():

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

编辑(由QOP): 由于文档 SQLITE自动启动ED列指出:

上面描述的正常ROWID选择算法 将产生单调增加独特的rowids 只要您从未使用最大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的所有别名。

其他提示

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

解决了:

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

对于更好的性能,请在SQLITE中使用它:

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

这也适用于MySQL。这会更快,因为 SQL引擎首先加载行的行电场到内存,然后对它们进行排序, ,在这里,我们只是加载并随机排序行的ID字段,然后获取它们的X,并找到这些X ID的整个行,默认情况下为索引。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top