從資料庫獲取 10 條隨機資料

2021-08-10 15:19:31 字數 2191 閱讀 2040

sql server:

select top 10 * from t_user order

by newid();

oracle:
select * from (select * from t_user order

by dbms_random.random()) where ronum <= 10;

mysql:

從 mysql 隨機選取資料最簡單的辦法就是使用 」order by rand() 」;

方案一:

select * from

table

order

by rand() limit 10;

這種方法的問題就是非常慢。原因是因為 mysql 會建立一張零時表來儲存所有的結果集,然後給每個結果乙個隨機索引,然後再排序並返回。

有幾個方法可以讓它快起來。

基本思想就是先獲取乙個隨機數,然後使用這個隨機數來獲取指定的行。

由於所有的行都有乙個唯一的 id,我們將只取最小和最大 id 之間的隨機數,然後獲取 id 為這個數行。為了讓這個方法當 id 不連續時也能有效,我們在最終的查詢裡使用 」>=」代替」=」。

為了獲取整張表的最小和最大 id,我們使用 max() 和 min() 兩個聚合函式。這兩個方法會返回指定組裡的最大和最小值。在這裡這個組就是我們表裡的所有 id 字段值。

方案二:

$range_result = mysql_query( " select

max(id) as max_id , min(id) as min_id from

table

");

$range_row = mysql_fetch_object( range_result );

$random = mt_rand( range_row->min_id , $range_row->max_id );

$result = mysql_query( "

select * from

`table`

where

`id` >= random limit 0,1

");

就像我們剛才提到的,這個方法會用唯一的id值限制表的每一行。那麼,如果不是這樣情況怎麼辦?

下面這個方案是使用了 mysql 的 limit 子句。limit 接收兩個引數值。第乙個引數指定了返回結果第一行的偏移量,第二個引數指定了返回結果的最大行數。偏移量指定第一行是0而不是1。

為了計算第一行的偏移量,我們使用 mysql 的 rand() 方法從 0 到 1 之間生成乙個隨機數。然後我們把這個數字跟我們用 count() 方法獲取倒的表記錄數相乘。由於limit的引數必須是int型而不能是 float,我們使用 floor() 來處理結果。floor() 會計算小於表示式的最大值。最終的**就是這樣:

方案三:

$offset_result = mysql_query( " select floor(rand() * count(*)) as offset from

table

");

$offset_row = mysql_fetch_object( offset_result );

$offset = offset_row->offset;

$result = mysql_query( "

select * from

`table` limit offset, 1

" );

在 mysql 4.1 以後我們可以使用子子查詢合併上面兩個方法

方案四:

select * from

table

where id >= (select floor( max(id) * rand()) from

table ) order

by id limit 1;

這個方案跟方案二有同樣的弱點,只對有唯一 id 值的表有效。

記住我們最初尋找選擇隨機行的替代方法的原因,速度!所以,這些方案的在執行時間上的比較會怎麼樣?我不會指出硬體和軟體配置或者給出具體的數字。大概的結果是這樣的:

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

sql server select top 10 from t user order by newid oracle select from select from t user order by dbms random.random where ronum 10 mysql select from...

SQL在各種資料庫中獲取隨機資料記錄

在sql server中可以通過以下方式來取得隨機的前n條記錄 select top n from table name order by newid newid 返回全域性 guid 的 uniqueidentifier 型別的唯一值 n值是你要所取得的記錄數 在access中隨機抽取的方法 se...

如何從HITRAN資料庫 獲取資料

最近研究了一下hitran 資料庫,在網路上關於hitran 的介紹不是很多,而且有點不太詳細。所以這篇部落格就從小白的角度介紹一下hitran 資料庫以及從中獲取資料的方法。hitran資料庫是光譜引數的彙編,用於模擬和分析氣態介質 尤其是陸地大氣 中的光的傳輸和發射。自1960年代末成立以來 當...