最近頭腦王者很是火爆,公司也在開發相似頭腦王者的答題系統,這個重任交到我這邊來了,咱們在開發的這個微信小程序答題系統,須要實現隨機出題。尤爲是一些好比闖關的環節,須要隨機從題庫裏抽取若干道題目,給到用戶答題。那麼要如何來作呢?php
首先咱們要作兩張表,一張是exam表,用來存考卷的。另一張是題庫表,question表。前端
在exam表裏設置好考試的參數,好比說本次考試是隨機抽多少題,而後在sql語句中,隨機從question表中抽取題目。sql
注意了,劃重點了,一些關鍵點來了。小程序
隨機抽題目,通常人想到的是sql語句的 order by rand ,而後網上你搜下 order by rand語句的優化,也有人提到過,這個order by rand 執行效率很低。尤爲是好比你的題庫很大,若是你作大平臺的,必定會在後期發生的。咱們本身是作平臺的,開發好這套系統是要不斷的複製賣給全部的須要的客戶的。因此客戶出的題目確定會愈來愈多,題庫要越賴越大的。題庫隨着考試次數增多,題庫將會變的很是大。因此提早就要想好解決辦法,一次性把代碼寫到位。後端
使用ORDER BY RAND 一個15萬餘條的庫,查詢5條數據,竟然要8秒以上。查看官方手冊,也說rand()放在ORDER BY 子句中會被執行屢次,天然效率及很低。微信小程序
怎麼優化方法不少,你們自行百度,我用的是使用sql語句 limit的偏移量來作的。 微信
話很少說,直接上代碼了。tp的風格哈。學習
$total=$questionTable->where($search)->count(); //查看下對應的題目總數有多少 if($total<=$getrand_Num){ //總的題目數比須要的還小 那就不用隨機了 直接出所有的題目就好了 $offset = 0; }else{ $offset = mt_rand(0, $total-1); //偏移量 } $list=$questionTable->where($search)->field($field)->limit($offset,$getrand_Num)->select();
不知道各位看懂了沒有,這個偏移量的,就是使用這個模式來隨機抽取題目。但願你也按照這個思路優化下你的考試答題系統的隨機出題邏輯。 優化
我,秋峯,phper,目前自創業,作項目系統開發,php後端加小程序前端結合 今天就給你們分享到這裏,但願對你們有所幫助。歡迎交流 你們相互學習 共同提升 個人 微信號:qiufeng2999spa