MySQL取出隨機(jī)數(shù)據(jù)
他們?cè)瓉?lái)都想用PHP的實(shí)現(xiàn)隨機(jī),但取出多條好像要進(jìn)行兩次以上查詢(xún).
翻了手冊(cè),找到了下面這個(gè)語(yǔ)句,可以完成任務(wù)了,但效率較低
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.*以上才支持這樣的子查詢(xún).
下面是其它網(wǎng)友的補(bǔ)充:
select id from zhyx_items order by rand() 這樣效率太低了
優(yōu)化sql語(yǔ)句之后:
SELECT t1.id FROM zhyx_items AS t1 JOIN (SELECT ROUND(RAND() * ((SELECT MAX(id) FROM zhyx_items)-(SELECT MIN(id) FROM zhyx_items))+ (SELECT MIN(id) FROM zhyx_items)) AS id) AS t2 WHERE t1.id >= t2.id ORDER BY t1.id LIMIT 0,5;
- mysql隨機(jī)查詢(xún)?nèi)舾蓷l數(shù)據(jù)的方法
- MYSQL隨機(jī)抽取查詢(xún) MySQL Order By Rand()效率問(wèn)題
- MySQL查詢(xún)隨機(jī)數(shù)據(jù)的4種方法和性能對(duì)比
- SQL 隨機(jī)查詢(xún) 包括(sqlserver,mysql,access等)
- 數(shù)據(jù)庫(kù)查詢(xún)排序使用隨機(jī)排序結(jié)果示例(Oracle/MySQL/MS SQL Server)
- 從MySQL數(shù)據(jù)庫(kù)表中取出隨機(jī)數(shù)據(jù)的代碼
- mysql獲取隨機(jī)數(shù)據(jù)的方法
- MySQL中隨機(jī)生成固定長(zhǎng)度字符串的方法
- php隨機(jī)取mysql記錄方法小結(jié)
- MySQL 隨機(jī)函數(shù)獲取數(shù)據(jù)速度和效率分析
相關(guān)文章
關(guān)于mysql中時(shí)間日期類(lèi)型和字符串類(lèi)型的選擇
大家好,本篇文章主要講的是關(guān)于mysql中時(shí)間日期類(lèi)型和字符串類(lèi)型的選擇,感興趣的朋友趕快來(lái)看一看吧,希望對(duì)你有幫助2021-11-11Mysql日期格式以及內(nèi)置日期函數(shù)用法詳解
MySQL中有多種數(shù)據(jù)類(lèi)型可以用于日期和時(shí)間的表示,這篇文章主要給大家介紹了關(guān)于Mysql日期格式以及內(nèi)置日期函數(shù)用法的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-05-05新手入門(mén)Mysql--sql執(zhí)行過(guò)程
MySQL 是一種關(guān)系型數(shù)據(jù)庫(kù),在Java企業(yè)級(jí)開(kāi)發(fā)中非常常用,因?yàn)?MySQL 是開(kāi)源免費(fèi)的,并且方便擴(kuò)展MySQL是開(kāi)放源代碼的,因此任何人都可以在 GPL的許可下下載并根據(jù)個(gè)性化的需要對(duì)其進(jìn)行修改2021-06-06mysql left join快速轉(zhuǎn)inner join的過(guò)程
inner join內(nèi)連接,顯示兩個(gè)表中有聯(lián)系的所有數(shù)據(jù)而left join,左鏈接,以左表為參照,顯示所有數(shù)據(jù),右表中沒(méi)有則以null顯示,本文重點(diǎn)給大家講解mysql left join快速轉(zhuǎn)inner join的過(guò)程,需要的朋友參考下吧2021-06-06MySQL觸發(fā)器實(shí)現(xiàn)兩表數(shù)據(jù)同步的代碼詳解
在數(shù)據(jù)庫(kù)應(yīng)用中,我們經(jīng)常需要對(duì)數(shù)據(jù)進(jìn)行某些操作,并在操作完成后進(jìn)行相應(yīng)的處理,這時(shí)候,可以使用觸發(fā)器來(lái)實(shí)現(xiàn)這些功能,MySQL提供了強(qiáng)大的觸發(fā)器功能,本文將給大家詳細(xì)介紹MySQL觸發(fā)器實(shí)現(xiàn)兩表數(shù)據(jù)同步,需要的朋友可以參考下2023-12-12mysql日常使用中常見(jiàn)報(bào)錯(cuò)大全
MySQL初學(xué)者新安裝好數(shù)據(jù)庫(kù)及使用過(guò)程中經(jīng)常遇到以下幾類(lèi)錯(cuò)誤,本文給大家詳細(xì)整理并給出完美解決方案,感興趣的朋友跟隨小編一起看看吧2023-03-03數(shù)據(jù)庫(kù)Mysql性能優(yōu)化詳解
這篇文章主要介紹了數(shù)據(jù)庫(kù)Mysql性能優(yōu)化的相關(guān)資料,需要的朋友可以參考下2016-05-05