MySQL數據庫中隨機獲取一條或多條記錄


 

在開發過程中遇到了一個問題,使用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. 隨機獲取單條數據

  1.  
    SELECT * FROM table_name AS t1 JOIN (SELECT ROUND(RAND()*((SELECT MAX(id)
  2.  
    FROM table_name)-(SELECT MIN(id) FROM table_name))+(SELECT MIN(id)
  3.  
    FROM table_name)) AS id)AS t2 WHERE t1.id>=t2.id ORDER BY t1.id LIMIT 1;

簡寫版:

  1.  
    SELECT * FROM table_name AS t1 JOIN (SELECT ROUND(RAND()*(SELECT MAX(id)
  2.  
    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.隨機獲取單條或多條數據

  1.  
    SELECT * FROM table_name as t1 WHERE t1.id>=(RAND()*((SELECT MAX(id) FROM
  2.  
    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在任何情況下取出的都是所需要的隨機數據。

 

希望對大家有所幫助!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM