【发布时间】:2010-11-18 05:19:29
【问题描述】:
在 MySQL 中我可以使用 RAND() 函数,在 SQLite 3 中有什么替代方法吗?
【问题讨论】:
标签: sql mysql database sqlite random-access
在 MySQL 中我可以使用 RAND() 函数,在 SQLite 3 中有什么替代方法吗?
【问题讨论】:
标签: sql mysql database sqlite random-access
已解决:
SELECT * FROM table ORDER BY RANDOM() LIMIT 1;
【讨论】:
SELECT * FROM table ORDER BY RANDOM() LIMIT 1;
【讨论】:
使用random():
SELECT foo FROM bar
WHERE id >= (abs(random()) % (SELECT max(id) FROM bar))
LIMIT 1;
编辑(按 QOP): 因为SQLite Autoincremented 列上的文档指出:
上面描述的普通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 的别名。
【讨论】:
为了获得更好的性能,请在 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 快约 30 倍,并且仍然提供真正的随机,对表架构没有任何要求。