sqlite- rand()订购
-
12-09-2019 - |
题
在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的整个行,默认情况下为索引。
不隶属于 StackOverflow