以前碰見這種使用場景都是直接order by rand()來處理的,但是效率實在是不敢恭維,所以最近又碰見這種場景,在網上找尋下比較好的解決辦法.
1.order by rand()
寫法:
SELECT
id
FROM
`table`
ORDER BY
rand()
這種寫法的缺點是rand函數在order by中被執行多次,影響效率。
2.max(id) * rand() 使用join
寫法:
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;
網上的大佬們都推薦第二種寫法,特此記錄下,感覺最大id和最小id可以放在程序里來計算。
這里有個問題是如果取多條 那么一定是連續的,所以如果是不想取連續數據,得循環,不過此語句效率極高,所以循環查詢是可以做的。
以上就是全部相關知識點內容,有需要的朋友們可以學習下,感謝大家對腳本之家的支持。