在MySQL中我可以使用RAND()函数,在SQLite 3中有没有其他选择?
答案 0 :(得分:125)
SELECT * FROM table ORDER BY RANDOM() LIMIT 1;
答案 1 :(得分:48)
使用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的别名。
答案 2 :(得分:35)
解决:
SELECT * FROM table ORDER BY RANDOM() LIMIT 1;
答案 3 :(得分:12)
为了获得更好的性能,请在SQLite中使用它:
SELECT * FROM table WHERE id IN (SELECT id FROM table ORDER BY RANDOM() LIMIT x)
这也适用于MySQL。这样运行得更快,因为 SQL引擎首先将行的预计字段加载到内存然后对它们进行排序,这里我们只是加载并随机排序行的id字段,然后我们得到它们的X,并找到整行这些X ids默认为索引。