iT邦幫忙

0

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

ahan 2008-09-16 16:43:409449 瀏覽

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

資料要亂數排序
還要分頁

真是江山代有才人出
這題,難倒我了...
是每一個visitor都需要亂數排序嗎?有點好奇是什麼樣的情況需要這樣的需求?

2 個回答

12
mizuiro
iT邦新手 2 級 ‧ 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);

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

fillano iT邦超人 1 級 ‧ 2008-09-17 14:01:50 檢舉

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

16
fillano
iT邦超人 1 級 ‧ 2008-09-16 18:28:35

您的要求真特別......

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

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

  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的更新時間,程式可以設定好不會在更新時間用到更新的資料表等)另外這個方法恐怕不適用在你資料頻繁更新,而又要求亂數排序必須時常趕上資料更新的狀況。(這樣用這個方法恐怕沒解)

我要發表回答

立即登入回答