SQLite – ORDER BY RAND()
在MySQL中,我可以使用RAND()函数,在SQLite 3中还有其他的select吗?
使用random() :
SELECT foo FROM bar WHERE id >= (abs(random()) % (SELECT max(id) FROM bar)) LIMIT 1;
编辑(由QOP):由于在SQLite自动增量文件列ed状态:
上面描述的正常ROWIDselectalgorithm将生成单调递增的唯一ROWID ,只要您从不使用最大ROWID值,并且永不删除具有最大ROWID的表中的条目。 如果您删除了行,那么在创build新行时,可能会重复使用以前删除的行中的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引擎首先将行的投影字段加载到内存然后对它们进行sorting ,这里我们只是加载并随机sorting行的id字段,然后我们得到它们的X,并find这些XID的整行默认索引。