Ali*_*xel 64 mysql sql database sqlite random-access
在MySQL中我可以使用RAND()函数,在SQLite 3中有没有其他选择?
avn*_*nic 130
SELECT * FROM table ORDER BY RANDOM() LIMIT 1;
Run Code Online (Sandbox Code Playgroud)
dfa*_*dfa 49
使用random():
SELECT foo FROM bar
WHERE id >= (abs(random()) % (SELECT max(id) FROM bar))
LIMIT 1;
Run Code Online (Sandbox Code Playgroud)
编辑(通过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;
Run Code Online (Sandbox Code Playgroud)
ROWID
,_ROWID_
并且OID
是SQLite内部行id的所有别名.
Ali*_*xel 35
解决了:
SELECT * FROM table ORDER BY RANDOM() LIMIT 1;
Run Code Online (Sandbox Code Playgroud)
Ali*_*Ali 14
要获得更好的性能,请在SQLite中使用它:
SELECT * FROM table WHERE id IN (SELECT id FROM table ORDER BY RANDOM() LIMIT x)
Run Code Online (Sandbox Code Playgroud)
这也适用于MySQL.这样运行得更快,因为SQL引擎首先将行的投影字段加载到内存然后对它们进行排序,这里我们只是加载并随机排序行的id字段,然后我们得到它们的X,并找到这些X ID的整行,默认索引.