在MySQL中,我可以使用RAND()函数,SQLite 3中是否还有其他选择?
相关问题:stackoverflow.com/questions/2171578/seeding-sqlite-random
—
Alix Axel
在MySQL中,我可以使用RAND()函数,SQLite 3中是否还有其他选择?
Answers:
使用random():
SELECT foo FROM bar
WHERE id >= (abs(random()) % (SELECT max(id) FROM bar))
LIMIT 1;
编辑(通过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;
ROWID
,_ROWID_
并且OID
都是SQLite内部行ID的别名。
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的整个行,即默认索引。
SELECT * FROM table ORDER BY RANDOM() LIMIT 1
,并且仍然对表模式没有任何要求,却能提供真正的随机性。