在開發過程中遇到了一個問題,使用MySQL數據庫,用SQL語句在表中隨機獲取一條或多條數據,看似簡單,但是往深層研究的話還是很有深度的,查了好多資料,接下來給大家分享一下:
1. 隨機獲取單條數據
SELECT * FROM table_name ORDER BY RAND() LIMIT 1;
MySQL中的RAND()函數調用可以在0和1之間產生一個隨機數。
這條SQL語句可以隨機取出一條數據,而且將limit 1改為獲取多條數據,得到的數據也是隨機的。但是,在MYSQL的官方手冊,里面針對RAND()的提示大概意思就是,在ORDER BY從句里面不能使用RAND()函數,因為這樣會導致數據列被多次掃描。導致效率相當的低!但是在MYSQL 3.23版本中,仍然可以通過ORDER BY RAND()來實現隨機。
盡量不用這種寫法!
2. 隨機獲取單條數據
-
SELECT * FROM table_name AS t1 JOIN (SELECT ROUND(RAND()*((SELECT MAX(id)
-
FROM table_name)-(SELECT MIN(id) FROM table_name))+(SELECT MIN(id)
-
FROM table_name)) AS id)AS t2 WHERE t1.id>=t2.id ORDER BY t1.id LIMIT 1;
簡寫版:
-
SELECT * FROM table_name AS t1 JOIN (SELECT ROUND(RAND()*(SELECT MAX(id)
-
FROM table_name)) AS id) AS t2 WHERE t1.id>=t2.id ORDER BY t1.id LIMIT 1;
簡化的寫法將表中的MIN(id)看做0,是對整個數據表進行操作,而第一條可以對某一范圍的數據進行操作,視情況而定。
在MySQL中,ROUND()函數用於數據的四舍五入。
這條sql語句的執行效率相當的高,但是,將limit 1改為獲取多條數據后,取出的數據不是隨機的,原因是order by引起的,
order by將t1.id給排序了,因此獲取到的數據不是隨機的。
如果是隨機獲取單條數據的話適用,獲取多條的話不適用!
3.隨機獲取單條或多條數據
-
SELECT * FROM table_name as t1 WHERE t1.id>=(RAND()*((SELECT MAX(id) FROM
-
table_name)-( SELECT MIN(id) FROM table_name))+(SELECT MIN(id) FROM table_name)) LIMIT 1;
簡寫版:
SELECT * FROM table_name as t1 WHERE t1.id>=(RAND()*(SELECT MAX(id) FROM table_name))LIMIT 1;
簡寫效果同上,視情況而定。
這條sql語句的執行效率也是非常高,將limit 1改為獲取多條數據,效率也是很高,而且得到的數據是隨機的。
隨機獲取單條或多條數據都適用!
總結:語句1的效率低下,切忌使用,不過在數據量少,MYSQL版本支持的情況下可以使用;
語句2的效率高,在隨機取出一條記錄的情況下可以使用;
語句3的效率也高,在隨機取出一條或多條記錄的情況下都可以使用,不過在取出一條記錄時優先使用語句2,因為采用 JOIN的語法比直接在WHERE中使用函數效率還是要高一些的。
注:語句2和語句3在操作數據庫時,數據都是同一種類型或者某一類型的數據是連續存放在一起的,否則取出的數據可能不是所 需類型的隨機數據,而語句1在任何情況下取出的都是所需要的隨機數據。
希望對大家有所幫助!