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的整行默认索引。