select * from table_name order by rand() limit 5;
rand在手冊(cè)里是這么說(shuō)的:
rand()
rand(n)
返回在范圍0到1.0內(nèi)的隨機(jī)浮點(diǎn)值。如果一個(gè)整數(shù)參數(shù)n被指定,它被用作種子值。
mysql> select rand();
-> 0.5925
mysql> select rand(20);
-> 0.1811
mysql> select rand(20);
-> 0.1811
mysql> select rand();
-> 0.2079
mysql> select rand();
-> 0.7888
你不能在一個(gè)order by子句用rand()值使用列,因?yàn)閛rder by將重復(fù)計(jì)算列多次。然而在mysql3.23中,你可以做: select * from table_name order by rand(),這是有利于得到一個(gè)來(lái)自select * from table1,table2 where a=b and c<d order by rand() limit 1000的集合的隨機(jī)樣本。注意在一個(gè)where子句里的一個(gè)rand()將在每次where被執(zhí)行時(shí)重新評(píng)估。
但我試了一下,8千條記錄的表,執(zhí)行一次需要0.08 sec,.慢了些
后來(lái)請(qǐng)教了google,得到如下代碼
select *
from table_name as r1 join
(select round(rand() *
(select max(id)
from table_name)) as id)
as r2
where r1.id >= r2.id
order by r1.id asc
limit 5;
執(zhí)行效率需要0.02 sec.可惜的是,只有mysql 4.1.*以上才支持這樣的子查詢.
注冊(cè)會(huì)員,創(chuàng)建你的web開(kāi)發(fā)資料庫(kù),新聞熱點(diǎn)
疑難解答
圖片精選