在開發過程中遇到了乙個問題,使用mysql資料庫,用sql語句在表中隨機獲取一條或多條資料,看似簡單,但是往深層研究的話還是很有深度的,查了好多資料,接下來給大家分享一下:
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()來實現隨機。
盡量不用這種寫法!
select * from table_name as t1 join (select round(rand()*((select max(id)
from table_name)-(select min(id) from table_name))+(select min(id)
from table_name)) as id)as t2 where t1.id>=t2.id order by t1.id limit 1;
簡寫版:
select * from table_name as t1 join (select round(rand()*(select max(id)
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給排序了,因此獲取到的資料不是隨機的。
如果是隨機獲取單條資料的話適用,獲取多條的話不適用!
select * from table_name as t1 where t1.id>=(rand()*((select max(id) from
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在任何情況下取出的都是所需要的隨機資料。
MySQL資料庫中隨機獲取一條或多條記錄
工作中會遇到從資料庫中隨機獲取一條或多條記錄的場景,下面介紹幾種隨機獲取的方法供參考。首先建立個users表演示 create table users id int 11 not null auto increment,username varchar 255 default null,age in...
mysql隨機獲取一條或者多條資料
研究一些隨機的因素,主要是講究效率問題。語句一 select from users order by rand limit 1 mysql手冊裡面針對rand 的提示大概意思就是,在 order by從句裡面不能使用rand 函式,因為這樣會導致資料列被多次掃瞄,導致效率相當相當的低,效率不行,切忌...
mysql隨機獲取一條或者多條資料
轉來備份 研究一些隨機的因素,主要是講究效率問題。語句一 select from users order by rand limit 1 mysql手冊裡面針對rand 的提示大概意思就是,在 order by從句裡面不能使用rand 函式,因為這樣會導致資料列被多次掃瞄,導致效率相當相當的低,效率...