Select random row(s) in SQLite

后端 未结 5 916
感动是毒
感动是毒 2020-11-27 03:29

In MySQL, you can select X random rows with the following statement:

SELECT * FROM table ORDER BY RAND() LIMIT X

This does not, however, wo

5条回答
  •  借酒劲吻你
    2020-11-27 04:18

    All answers here are based on ORDER BY. This is very inefficient (i.e. unusable) for large sets because you will evaluate RANDOM() for each record, and then ORDER BY which is a resource expensive operation.

    An other approach is to place abs(CAST(random() AS REAL))/9223372036854775808 < 0.5 in the WHERE clause to get in this case for example 0.5 hit chance.

    SELECT *
    FROM table
    WHERE abs(CAST(random() AS REAL))/9223372036854775808 < 0.5
    

    The large number is the maximum absolute number that random() can produce. The abs() is because it is signed. Result is a uniformly distributed random variable between 0 and 1.

    This has its drawbacks. You can not guarantee a result and if the threshold is large compared to the table, the selected data will be skewed towards the start of the table. But in some carefully designed situations, it can be a feasible option.

提交回复
热议问题