方法一:
SELECT * FROM table ORDER BY RAND() LIMIT 1;
评价:不建议使用,效率非常低,官方文档中进行说明:Order By和RAND()连用,会多次扫描表,导致速度变慢。
方法二:
SELECT * FROM table
WHERE id >= (SELECT floor(RAND() * (SELECT MAX(id) FROM table)))
ORDER BY id LIMIT 1;
思路:先查询出table中的id的最大值,然后再获取一个小于此值的随机数,然后将满足条件的行都选出来,取第一个;
评价:有问题。如果id不是从0开始的话,比如从10000开始自增,那么SELECT floor (RAND() * (SELECT MAX(id) FROM table)) 将会很大概率得到小于10000的值,经过WHERE限定的查询结果将会是所有的查询结果的几率变大,最后LIMIT 1获取的是第一行数据的几率变高。
方法三:
SELECT * FROM table
WHERE id >= (SELECT floor (RAND() * ((SELECT MAX(id) FROM table) - (SELECT MIN(id) FROM table)) + (SELECT MIN(id) FROM table)))
ORDER BY id LIMIT 1;
方法四:
SELECT *
FROM table AS t1 JOIN (SELECT ROUND(RAND() * ((SELECT MAX(id) FROM table) - (SELECT MIN(id) FROM table)) + (SELECT MIN(id) FROM table)) AS id ) AS t2
WHERE t1.id >= t2.id
ORDER BY t1.id LIMIT 1;
评价:解决了方法二中MAX(id)的问题,可以获取MAX(id)和MIN(id)中的随机数。
原文地址:https://www.cnblogs.com/yuanfei1110111/p/10260521.html