2012-08-07 97 views
1

我有一個表像這樣更新MySQL表隨着隨機排序

ItemsTable 

item_id, cat_id, sort 
---------------------- 
1  1  1 
20  1  2 
15  1  3 
12  1  4 
11  1  5 
.... 
1521  1  1991 

在我的程序,頁面顯示每一次,它會拉動基礎上的排序號的下一個項目。所以,比如說我只顯示了排序= 2,下一次頁面將顯示項目排序= 3(也許排序是一個壞名字)。

我想要做的是,一旦我拉最後一項(排序= 1991),我想重新更新該表中的項目,並重新分配新的排序順序。

像這樣:

ItemsTable 

item_id, cat_id, sort 
---------------------- 
35  1  1 
7  1  2 
2  1  3 
1521  1  4 
700  1  5 
.... 
5  1  1991 

現在我的心裏都在想我已經編寫選擇記錄一個腳本,CAT_ID = 1個排序結果隨機,然後我不得不在PHP中創建一個循環,會更新數據庫1001次。在我看來,這似乎並不高效。

你們可以提供一個更好的選擇嗎?用MySQL做這件事最有效的方法是什麼?

+0

根據何時選擇數據,您無法自動執行重新排序。您可以編寫代碼來進行重新排序,但是您的應用程序需要在適當的時候觸發該代碼。 – MatBailie 2012-08-07 19:13:30

+0

正確。我已經完成了所有這些工作。我遇到的問題是隨機重新分配排序順序的查詢,但保持該順序。 – Hugo 2012-08-07 19:15:04

回答

0

這是做你想做的嗎?

order by cat_id, rand() 

或者,你想把你的結果集兩次:

select item_id, cat_id, sort 
from ((select t.*, 0 as whichgroup 
     from t 
    ) 
     union all 
     (select t.*, 1 as whichgroup 
     from t 
    ) 
    ) t 
order by cat_id, whichgroup, 
     (case when whichgroup = 0 then sort 
       else rand() 
      end) 

這兩次輸出的每個記錄,首先在「排序」命令,然後隨機。

基於您的評論,這可能是你想要什麼:

order by cat_id, 
     (case when sort <= 1991 then sort else rand() end) 
+0

不,我的意思是說,一旦顯示了1991年的項目,整個表格就會被使用,但是新的排序值會一直存在,直到第1991個項目再次出現。 – Hugo 2012-08-07 19:01:21

+0

在SQL中,表格是無序的。查詢結果是有序的。你能否重新解釋你的問題來澄清你真正需要的東西? – 2012-08-07 19:03:01

+0

基本上,我想保留表中記錄的排序順序,直到我的程序中達到閾值。一旦達到該閾值(換句話說,顯示項目1521)。使用新的隨機排序順序更新表,該排序順序將保持靜態,直到達到下一個閾值,此時數據庫會再次重新排序。 – Hugo 2012-08-07 19:05:44

1
SET @row := 0; 
UPDATE ItemsTable SET sort = (@row := @row + 1) WHERE cat_id = 1 ORDER BY RAND(); 

確定的研究和嘗試的事情了這解決了我的問題,幾個小時後。 它現在生成一個隨機數字序列。

我知道RAND()是不是很有效,但這是另一天:)

希望另一個問題這可以幫助別人。

+0

似乎對我來說是一個合理的解決方案。您只需確保此UPDATE脫機運行或以其他方式運行時不會阻止頁面加載。否則,每n個頁面加載將會非常慢。 – dimo414 2012-08-07 20:31:33