iThome online | iThome Blog | iThome周刊訂閱

載入中...

ahan

IT邦初學者
10級

亂數產生排序,但有需做分頁

請教大大
我使用php+mysql
若資料需亂數排序
但又有分頁的功能
有什麼方法實作會比較好呢
本來想說那把亂數的結果記錄在session中
但資料量大,似乎效益不佳且占資源
亦或有什麼函數可記錄亂數因子
或是有什麼較好的rule可去實現
丫里丫多



收到書籤:發佈到twitter      
解決時間:2008-09-18 21:48:23
發問時間:2008-09-16 16:43:40

▼ ADVERTISEMENT ▼

最佳解答(發問者自選)
5

回答:mizuiro ( IT邦初學者9級 )

時間:2008-09-17 11:54:05

MySQL 可使用 ORDER BY RAND(N);

例如:
SELECT * FROM TABLE ORDER BY RAND(1);

那SELECT 出來會是固定的亂數排列...

所以就把 RAND(N) 的 N 改掉~ 就會是另一種亂數排列...
只是排序的效能上好像不是很優~ 不過還是可以參考看看~~


不然也是可以從 PHP 也是可以指定 亂數種子 如:
srand(1);
$a = array(1,2,3,4,5,6,7,8,9,10);
shuffle($a);

也是會固定一定的排序
只是資料量大時,也是會有效能上的問題,就參考看看吧..^^

參考資料:php.net & mysql.com

[-隱藏]

回應

fillano 說:

嗯嗯,如果資料量不大,這個方法應該比較簡單好用。

2008-09-17 14:01:50

亂數產生排序,但有需做分頁
回答:fillano( IT邦好手2級 )
時間:2008-09-16 18:28:35
7
您的要求真特別......

如果要每個使用者每次使用時都即時做亂數排序,對於系統資源以及反應時間來說都太傷了吧?如果資料量成長,還會讓系統速度越來越慢哪。

我的想法是與其真的即時做亂數排序,不如預先做:

1. 建立數個temporary table,裡面用亂數把你要亂數排序的資料表的pk打散存放
2. 需要亂數排序的場合,隨機選一個temporary table name存在session裡面,然後用join的方式來讓選出來的資料是依照這個temporary table的順序
3. 定期更新這幾個temporary table來反應資料的更新狀況,系統重啟的時候也需要重新產生這幾個表。

理論上pk應該不會太佔空間,所以放temporary table應該還好。mysql上temporary table是用memory database engine來做,需要考慮記憶體空間使用的issue。如果不想這樣佔用記憶體,說不定拿一般的myisam來做也可以。

但是用這個方法有一些限制,更新temporary table時還是會影響到使用者的操作,所以最好是在人少的時候更新,或是使用一些更新的rule,讓更新時候不會用到更新的資料表。(例如排定每個temporary的更新時間,程式可以設定好不會在更新時間用到更新的資料表等)另外這個方法恐怕不適用在你資料頻繁更新,而又要求亂數排序必須時常趕上資料更新的狀況。(這樣用這個方法恐怕沒解)

回應

請填寫您的回應,長度限為1,000個字,回應不計點數,也不限使用次數



 

檢舉違規

違規事項:

*補充檢舉理由(可省略),字數不可超過100字

推薦

推薦理由:


*給回答者的鼓勵(可不填),字數不可超過100字

▼ ADVERTISEMENT ▼

熱門標籤

 cisco   crystal   exchange   it   java   javascript   linux   m-power   mail   microsoft   msnlib   msnp15   msnsdk   msn機器人   mysql   nas   oracle   outlook   pmi   pmp   raid   report   sap   server   smartquery   sql   vista   windows   xp   倍力   倍力資訊   免費軟體   國際專案管理師   報表   專案管理   微軟   有話大聲說   活動   省錢   網路   網路儲存   網路管理   網頁安全   網頁設計   資安   資料庫   資訊安全   防毒軟體   2003   2008