標籤:部分 val min 高效 ack asc back 讀取資料 最大
若要在i ≤r≤ j 這個範圍得到一個隨機整數r ,需要用到運算式 FLOOR( RAND() * (j – i)+i),RLOOR()取整樹部分,RAND()、ROUND(x,n)四捨五入取整,ROUND(x,n)表示隨機產生一個 0~x 之間的n位小數的數字。
例如, 若要在7 到 12 的範圍(包括7和12)內得到一個隨機整數, 可使用以下語句:
SELECT FLOOR(RAND()*(12-7)+7)
從 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 user 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 user AS U2) ) +(SELECT MIN(U3.userid) FROM users AS U3))
ORDER BY users.userid ASC
LIMIT 1
結論:隨機取一條或多條記錄,方法都不錯! (最佳方案)
附:field(column,value1,value2,value3,……) 代表根據column列自訂的順序排
mysql 隨機擷取一條或多條資料