方法一:
直接通過sql語句實現,如:
topn
*from
tablea
order
bynewid()
這是最簡單的方法,通過呼叫sqlserver的newid()函式(產生guid—全域性唯一標誌符)來產生隨機記錄。
採用這種方法時,需要將表中所有記錄與newid()生成的值進行比較從而進行排序。因此,如果表中的記錄較多,操作會非常緩慢。
方法二:
假設表中有乙個自增長主鍵,增量為1。這時我們可以這樣處理,取出主鍵的邊界值(最大值和最小值),然後通過乙個演算法得到介於(包括)兩個邊界之間的隨機值,最後按照這個值取出對應記錄。下面是c#的例子:
//生成隨機數
random rand
=new
random();
intnum
=rand.next(minval,maxval +1
); //
minval為主鍵的最小值,maxval為主鍵的最大值
//讀取記錄的sql字串
string
sqlstr ="
select * from tablea where pk = "+
num;
這種方法較前一種方法的操作速度有了較大提高(特別是在大資料量的情況下)。但只有當主鍵值是連續的,中間沒有斷開的情況,並且增量為1時才能用這種方法。那麼,如何才能解決這個問題呢?請繼續往下看。
方法三:
對方法二進行了改進。主要思路是,將表中所有的主鍵值讀進乙個陣列,從陣列中隨機讀出乙個值,按照這個值取出對應記錄。下面是c#的例子:
//將主鍵值讀進arraylist
arraylist dataindex
=new
arraylist();
while
(sdr.read())
//sdr為存放所有主鍵值的sqldatareader
//從arraylist中隨機讀取資料項
random rand
=new
random();
intnum
=convert.toint32(dataindex[rand.next(dataindex.length)]);
//讀取記錄的sql字串
string
sqlstr ="
select * from tablea where pk = "+
num;
這樣不管主鍵是否為自增長字段,也不管數值是否連續,都能夠應付自如了。經過筆者的測試,在資料量為50萬的情況下**執行速度幾乎沒有受到什麼影響,可見arraylist的操作效能是可以信賴的。
mysql隨機顯示記錄 MySQL隨機讀取表中記錄
order by rand 來實現 select from table order by rand 記憶體臨時表 order by rand 是一般通過記憶體臨時表排序,可以通過執行計畫explain中extra欄位顯示using temporary觀察到。由於是記憶體排序,回表過程不涉及機械磁碟i...
asp隨機讀取資料庫記錄
1 set rs server.createobject adodb.recordset rs.open select from news conn,1,1 if not rs.eof and rs.bof then rs.movefirst randomize 初始化乙個隨機數 i int rs....
資料庫中隨機讀取記錄的方法總結
1.sql server select top 10 from table order by newid 2.access select top 10 from table order by rnd id 其中id為自增1的字段 3.access asp randomize select top 1...