1. 程式人生 > >mysql 資料庫rand() 隨機查詢10條資料 整理

mysql 資料庫rand() 隨機查詢10條資料 整理

網上找了好多看了還不是很明白,為了專案進度拿過來直接用。害怕以後還需要。好找一些,放在這裡。

若要在i ≤ R ≤ j 這個範圍得到一個隨機整數R ,需要用到表示式 FLOOR(i + RAND() * (j – i + 1))。例如, 若要在7 到 12 的範圍(包括7和12)內得到一個隨機整數, 可使用以下語句:

SELECT FLOOR(7 + (RAND() * 6));

以上摘抄自MySQL手冊

從 Mysql 表中隨機讀取資料不難,方法還挺多的,但是如果要考慮效率,得到一個快速的高效率的方法,那就不是一件簡單的事情了(至少對我來說不簡單)。

隨機獲得Mysql資料表的一條或多條記錄有很多方法,下面我就以users(userId,userName,password……)表(有一百多萬條記錄)為例,對比講解下幾個方法效率問題:


  1. select * from      users order by rand() LIMIT 1
    執 行該sql語句,老半天沒有反應,最後被迫手動停止執行,怎個傷人了得啊!後來我查了一下MYSQL手冊,裡面針對RAND()的提示大概意思就是,在 ORDER BY從句裡面不能使用RAND()函式,因為這樣會導致資料列被多次掃描,導致效率相當相當的低!效率不行,切忌使用!
  2. SELECT * FROM      users  AS t1  JOIN (SELECT ROUND(RAND() * ((SELECT MAX(userId)      FROM `users`)-(SELECT MIN(userId) FROM users))+(SELECT MIN(userId) FROM      users)) AS userId) AS t2 WHERE t1.userId >= t2.userId ORDER BY      t1.userId LIMIT 1
    執行該sql語句,用時0.031s,效率沒說的,相當的給力!心裡那個爽啊,緊接著,我把”LIMIT      1“改為了”LIMIT 100“ 隨機取一百條記錄,用時0.048,給力吧。可是就在此時問題出現了,發現結果好像不是隨機的?為了驗證結果,又執行了N次,真不是隨機的, 問題出現在”ORDER BY t1.userId“這裡,按userId排序了。隨機取一條記錄還是不錯的選擇,多條就不行了啊!
  3. SELECT * FROM      users WHERE userId >= ((SELECT MAX(userId) FROM users)-(SELECT      MIN(userId) FROM users)) * RAND() + (SELECT MIN(userId) FROM users)       LIMIT 1
    執行該sql語句,用時0.039s,效率太給力了!接著我就把”LIMIT 1“改為了”LIMIT 10000“,用時0.063s。經過多次驗證,哥對燈發誓,結果肯定是隨機的!
    結論:隨機取一條或多條記錄,方法都不錯!
  4. 通過sql獲得最大值和最小值,然後通過php的rand生成一個隨機數randnum,再通過SELECT * FROM users WHERE userId >= randnum LIMIT 1,獲得一條記錄效率應該還可以,多條應該就不行了。

    結論:方法1效率不行,切忌使用;隨機獲得一條記錄,方法2是相當不錯的選擇,採用JOIN的語法比直接在WHERE中使用函式效率還是要高一些的,不過方法3也不錯;隨機獲得多條記錄,方法3沒說的!

大家看下我的 查詢隨機 條件是 先按釋出的最新排序然後就行隨機查詢8條

$forum_data  是表名 這樣隨機查詢的效果還是很快的
$sql="SELECT * FROM  ( SELECT * FROM $forum_data  $where  ORDER BY `dateline` DESC ) AS T WHERE pid >= ((SELECT MAX(pid) FROM $forum_data)-(SELECT MIN(pid) FROM $forum_data)) * RAND() + (SELECT MIN(pid) FROM $forum_data) LIMIT 8";

然後下面,這個是兩個表 連表查詢 然後加 where 條件 然後在隨機6條。(強調一點資料要足夠多,不然 隨機不出來那麼多資料)

$sql="SELECT aid FROM  $forum_attach  AS  a  LEFT JOIN $forum_post AS p ON  a.pid=p.pid $where  AND aid >= ((SELECT MAX(aid) FROM $forum_attach)-(SELECT MIN(aid) FROM $forum_attach)) * RAND() + (SELECT MIN(aid) FROM $forum_attach) LIMIT 6 ";


相關推薦

mysql 資料庫rand() 隨機查詢10資料 整理

網上找了好多看了還不是很明白,為了專案進度拿過來直接用。害怕以後還需要。好找一些,放在這裡。若要在i ≤ R ≤ j 這個範圍得到一個隨機整數R ,需要用到表示式 FLOOR(i + RAND() * (j – i + 1))。例如, 若要在7 到 12 的範圍(包括7和12

mysql隨機查詢若干資料

在mysql中查詢5條不重複的資料,使用以下:<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />SELECT * FROM`table`ORDERBYRAND()

資料庫隨機資料 四種資料庫隨機獲取10資料的方法

四種資料庫隨機獲取10條資料的方法 SQL Server: 程式碼如下: SELECT TOP 10 * FROM T_USER ORDER BY NEWID() ORACLE: 程式碼如下: SELECT * FROM (SELECT * FROM T_USER ORDE

mysql怎樣高效率隨機獲取n資料

ID連續的情況下(注意不能帶where,否則結果不好): SELECT * FROM `mm_account` AS t1 JOIN ( SELECT ROUND( RAND() * ( SELECT MAX(id) FROM `mm_acco

java 使用jdbc向mysql資料庫中插入1億資料

<span style="font-size:14px;"><span style="font-size:14px;">package com.ddx.zhang; import java.sql.SQLException; import java

資料庫隨機查詢記錄的SQL

資料庫的隨機查詢SQL    1. Oracle,隨機查詢20條 select * from (  select  *  from 表名  order by dbms_random.value )  where rownum <= 20;   2.MS SQL Server,隨機查詢20條 select

mysql優化之資料庫隨機取一資料

大家都知道mysql 查詢資料庫隨機取一條資料當然用rand()方法  其實這個方法是超級雞肋的,當然你愛好也無所謂,首先列舉兩個表 a表   id(主鍵 int),cardnumber(身份證號碼 char(18)),name(使用者名稱 varchar(40))

mysql隨機獲取n資料

做秒殺時,碰到從秒殺商品中隨機取商品圖的問題,可以用order by rand() limit *隨機取出*條記錄; 例如: select gs.original_img from ecs_goods as gs where goods_id in( select goods_id

8、mysql資料庫多表查詢資料並集、內連線、左連結、右連結、全連線)

目錄 1 內連線 場景:A和B資料 的交集 2 左連結 場景1:得到 “AB交集後和A“ 的並集  (得到A的所有資料+滿足某一條件的B的資料) 場景2:得到A減去AB的交集  (A中所有資料減去同時滿足B某一條件的資料) 3 右連結 場景1:得到“A

mysql實現隨機獲取幾資料的方法

sql語句有幾種寫法 1:SELECT * FROM tablename ORDER BY RAND() LIMIT 想要獲取的資料條數; 2:SELECT *FROM `table` WHERE

MySQL資料庫學習06-查詢資料:排序和分組

一、對查詢結果排序 MySQL中可以使用ORDER BY子句對查詢到的結果進行排序。 1.單列排序 a.查詢f_name欄位,按照字母排序 2.多列排序 ORDER BY子句也可以實現對多列資料進行排序,需要將待排序的列之間用逗號隔開。對多列排序是

MySQL查詢資料的排名

//mysql可以執行,mybatis不能解析 SET @c=0; SELECT * FROM ( SELECT nurse_id,nurse_header,nurse_mark,@c:[ema

分別使用PreparedStatement和Statement對mysql資料庫進行建立表,增加資料查詢資料和刪除資料過程

在使用eclipse工具編寫Java程式碼連線資料庫並對資料庫進行處理時,總會用到對資料的增刪改查操作。那麼這個 時候就用到了java自帶的sql庫中的PreparedStatement或者Statement了。 其實PreparedStatement和Statement使

MySql從表結果集中隨機取一資料

部落格文章地址:http://blog.csdn.net/macwhirr123/article/details/7489484 Select * from (Select (@rowNo :[email protected]+1) AS rowno, pwd

【面經】面試官:如何以最高的效率從MySQL隨機查詢記錄?

## 寫在前面 > MySQL資料庫在網際網路行業使用的比較多,有些小夥伴可能會認為MySQL資料庫比較小,儲存不了很多的資料。其實,這些小夥伴是真的不瞭解MySQL。MySQL的小不是說使用MySQL儲存的資料少,而是說其體積小,比較輕量。使用MySQL完全可以儲存千億級別的資料,這個我會在後面的文

恢復 MySQL 資料庫人為誤操作丟失的資料

1. 全量備份與增量備份理論基礎 1.1 全量備份 全量資料就是資料庫中的所有資料,全量備份就是把資料庫中所有的資料進行備份。 1.2 增量備份 增量資料就是從上次全量備份之後,到下一次全備之前時間段更新的新資料。對於 MySQL 來說,binlog 日誌就是 MySQL 的增量資料。 1.3 按天

mysql資料庫中的bit是何種資料型別?

Bit稱為位資料型別,其資料有兩種取值:0和1,長度為1位。在輸入0以外的其他值時,系統均把它們當1看待。這種資料型別常作為邏輯變數使用,用來表示真、假或是、否等二值選擇。 SQL Server中儲存資料的一種型別,只能儲存true/false,程式讀取資料庫出來之後的表現形式是true或者fals

MySQL資料庫實驗:任務二 表資料的插入、修改及刪除

目錄 任務二 表資料的插入、修改及刪除 一、利用介面工具插入資料 二、資料更新 (一)利用MySQL命令列視窗更新資料 (二)利用Navicat for MySQL客戶端工具更新資料 三、資料庫的備份與還原

C# NetCore使用AngleSharp爬取周公解夢資料 MySql資料庫的自動建立和頁面資料抓取

這一章詳細講解編碼過程 那麼接下來就是碼程式碼了,GO 新建NetCore WebApi專案 空的就可以    NuGet安裝 Install-Package AngleSharp    或者介面安裝   using。。 預設本地裝有

mysql資料庫bom空格查詢及去除

bom空格佔三個字元 以訂單為例,匯入的訂單有時候訂單編號含有bom空格,列印賬單時賬單檔名亂碼,找不到對應賬單,404。,每種型別的訂單訂單編號是有固定長度的。 select distinct t.`order_type`,length(t.`order_no`)  from `