SQLite - ORDER BY RAND()

时间:2009-08-10 07:38:14

标签: sql mysql database sqlite random-access

在MySQL中我可以使用RAND()函数,在SQLite 3中有没有其他选择?

4 个答案:

答案 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默认为索引。