在SQLite中select随机行
在MySQL中,您可以使用以下语句selectX个随机行:
SELECT * FROM table ORDER BY RAND() LIMIT X
但是,这并不适用于SQLite。 有没有相同的东西?
为了更好的性能使用:
SELECT * FROM table WHERE id IN (SELECT id FROM table ORDER BY RANDOM() LIMIT x)
SQL引擎首先将行的投影字段加载到内存中,然后对它们进行sorting ,这里我们只是对内存中每行的id字段进行随机sorting,因为它是索引的,然后将它们分开,然后使用这些X ids来查找整行。
所以这消耗更less的内存和CPU随着表增长!
SELECT * FROM table ORDER BY RANDOM() LIMIT X
SELECT * FROM table ORDER BY RANDOM() LIMIT 1
这里的所有答案都基于ORDER BY
。 对于大型设备来说这是非常低效的(即不可用的)。 为什么不在WHERE
子句中放置abs(CAST(random() AS REAL))/9223372036854775808 < 0.5
以获得0.5次命中的机会呢?
SELECT * FROM table WHERE abs(CAST(random() AS REAL))/9223372036854775808 < 0.5
大数是random()
可以产生的最大绝对数。 abs()
是因为它是有符号的。 结果是一个0到1之间的均匀分布的随机variables。
SELECT * FROM table ORDER BY RAND() LIMIT 1
版本9.3.0(64位)