若要在i ≤r≤ j 這個范圍得到一個隨機整數r ,需要用到表達式 FLOOR( RAND() * (j – i)+i),RLOOR()取整樹部分,RAND()生成0~1的隨機數、ROUND(x,n)四舍五入取整,ROUND(x,n)表示四舍五入返回數字x的n位小數的數字,n可以是負數,這時是指定小數點左邊的n位整數位為0,同時小數位均為0;。
例如, 若要在7 到 12 的范圍(包括7和12)內得到一個隨機整數, 可使用以下語句:
SELECT FLOOR(RAND()*(12-7)+7)
如:3.434561和3.2452 保留2位小數取值
round(3.434561, 2) = 3.43;
round(3.2452, 2) = 3.25;
round(1113.2452, -2) = 1100;
從 Mysql 表中隨機讀取數據不難,方法還挺多的,但是如果要考慮效率,得到一個快速的高效率的方法。
隨機獲得Mysql數據表的一條或多條記錄有很多方法,下面以users(userId,userName,password……)表,百多萬條以上記錄為例:
1、常規使用方法
SELECT * FROM users ORDER BY RAND() LIMIT 1
結論:效率最慢,在 ORDER BY從句里面不能使用RAND()函數,因為這樣會導致數據列被多次掃描,導致效率相當相當的低!
2、SELECT * FROM users AS U0
JOIN
(SELECT FLOOR( RAND()*((SELECT MAX(U1.userid) FROM users AS U1)-(SELECT MIN(U2.userid) FROM users AS U2) ) +(SELECT MIN(U3.userid) FROM users AS U3)) AS userid ) AS U4
ON U0.userid>= U4.userid
LIMIT 1
結論:隨機一條數據效率還行,多條就不行
3、通過sql獲得最大值和最小值,然后通過php的rand生成一個隨機數randnum,再通過SELECT * FROM users WHERE userId >= randnum LIMIT 1
SELECT * FROM users WHERE
users.userid>= FLOOR( RAND()*((SELECT MAX(U1.userid) FROM users AS U1)-(SELECT MIN(U2.userid) FROM users AS U2) ) +(SELECT MIN(U3.userid) FROM users AS U3))
ORDER BY users.userid ASC
LIMIT 1
結論:隨機取一條或多條記錄,方法都不錯! (最佳方案)
附:field(column,value1,value2,value3,……) 代表根據column列自定義的順序排