2014-03-07 60 views
2

我想保持在數據庫顯示順序一個整型字段,這將是唯一的(明顯)如何保持在PHP中顯示順序字段中

現在可以說我有10條記錄在數據庫中,如果我將更新第10條記錄,並將顯示順序從10設置爲1,因此所有記錄從1到9將遞增1,如 顯示順序1將變成2,2到3,3到4,4到5 ....

那麼如何保持這個?

想要任何優化解決方案,如果我們有1000條記錄,那麼我們無法爲所有999條記錄激發更新查詢。

請幫我

+0

你爲什麼要在數據庫中創建display_order列? – ripa

+0

可以說假設我在我的網站上發佈產品,我有10個產品,並且想要改變顯示順序,所以對於這個我將使用我的這個字段「displayorder」 –

回答

1

你爲什麼不嘗試用函數或存儲過程 ..這兩個是不夠冷靜,處理這樣的情況..讓試用一下下面的一個..希望它會幫助你..

記得我正在考慮以下兩個參數

table name - DisplayOrder 
column name to reorder = O_nbr 

,如果你需要的O_nbr(訂單號),從10到1,你只需要調用方法

select UpdateOrder(10,1); 
// it will return you the proper message either updated or not.. or whatever 
轉移

功能代碼如下 -

DELIMITER $$ 
create function UpdateOrder (fromOrder int, toOrder int) 
RETURNS varchar(50) 
DETERMINISTIC 
BEGIN 
    DECLARE reslt varchar(50); 
    DECLARE rowCount int; 
    SET reslt = 'Error Occured.'; 
    if(fromOrder < 1) then 
    SET reslt='fromOrder can not be less then 1'; 
    elseif(toOrder < 1) then 
    SET reslt='toOrder can not be less then 1'; 
    else 
    select count(*) into rowCount from DisplayOrder;   
    if(rowCount < fromOrder) then 
     SET reslt = concat('Sorry check again, we have only ',rowCount, ' records'); 
    elseif(rowCount < toOrder) then 
     SET reslt = concat('Sorry check again, we have only ',rowCount, ' records'); 
    else 
     if(fromOrder = toOrder) then 
      SET reslt = 'No Changes were made.'; 
     else 
      if(fromOrder > toOrder) then 
       update DisplayOrder set O_nbr = 0 where O_nbr = fromOrder; 
       Update DisplayOrder set O_nbr = O_nbr+1 where O_nbr < fromOrder AND O_nbr > (toOrder-1) order by O_nbr desc; 
       update DisplayOrder set O_nbr = toOrder where O_nbr = 0; 
      end if; 
      if(fromOrder < toOrder) then 
       update DisplayOrder set O_nbr = 0 where O_nbr = fromOrder; 
       Update DisplayOrder set O_nbr = O_nbr-1 where O_nbr > fromOrder AND O_nbr < (toOrder+1) order by O_nbr asc; 
       update DisplayOrder set O_nbr = toOrder where O_nbr = 0; 
      end if; 
      SET reslt = 'Successfully done'; 
     end if; 
    end if;   
    end if;  
    RETURN reslt; 
END$$ 
DELIMITER ; 

你可以用你的列名與您表娜和更換DisplayOrder O_nbr重新排序

複製代碼並運行它在你的MySQL數據庫查詢窗口..然後使用上述簽名將訂單(O_nbr在DisplayOrder表中)移動。

Select UpdateOrder(fromOrder, toOrder); 

,如果你嘗試使用0或更低值,或任何不適當的條件下運行時,它將如果你傳遞正確的參數,返回你的錯誤信息

Select UpdateOrder(10, 0); 
//returns "toOrder can not be less then 1" 
Select UpdateOrder(11, 1); 
//return "Sorry check again, we have only 10 records" 
Select UpdateOrder(5, 5); 
//returns "No Changes were made." 

..

Select UpdateOrder(10, 2); 
//returns "Successfully done" 
+0

哇,好極了,非常感謝 –

2

可以使用更大的值顯示,喜歡說:

apple : 1 000 000 

orange : 2 000 000 

banana : 3 000 000 

現在,如果我想補充potato在位置2(N = 2)我取n( => 2:橙色)和(n-1)(=> 1:蘋果)的位置和除以2他們以獲得新的馬鈴薯位置:

(1 000 000 + 2 000 000)/ 2

= 1 500 000

apple : 1 000 000 

**potato : 1 500 000** 

orange : 2 000 000 

banana : 3 000 000 

這將工作一個相當長的時間,如果在某些時候,你覺得你已經用完這個模式,你仍然可以通過1000

所有數值乘以你可能也繼續使用較小的值(1,2,3,...)和定義它們的類型作爲DOUBLE,所以將它們除以2

EDIT時,他們將永遠不會碰撞:關於放置香蕉在位置1 :

使用公式(n +(n-1))/ 2:

這裏n = 1(新位置)。

我們的數據是:

apple : 1 000 000 

potato : 1 500 000 

orange : 2 000 000 

banana : 3 000 000 

(1 000000+(0))/ 2

= 500 000

予給的順序500到000香蕉:

**banana : 500 000** 

apple : 1 000 000 

potato : 1 500 000 

orange : 2 000 000 

另一種解決方案:創建一個文本字段,這將是一個索引器,幷包含所有ID。

「1,2,3,4,5,6,7」

現在,如果我想要把元素的id 8 3和4之間,我只需要替換 「4」,由」 8,4「。

儘管在索引n中查找元素在計算方面更復雜,所以我想讓personnaly使用第一個解決方案。

+0

如果我想在這裏的第一個位置香蕉怎麼辦? –

+0

(0 + 1000000)/ 2 => 500 000 –

+0

是指?請你能解釋一下嗎? –

0

您可以按任意順序顯示數據,而無需更改數據庫中的id字段值。
我不認爲有必要向最終用戶顯示ID的值,但僅用於內部參考。

你可以嘗試這樣的:

select * from my_table 
order by field(id, 10), id asc 

這將導致以獲取與頂部id10和其他行未來在ascending順序。

您可以在field中指定任意數量的值以在結果上以該特定順序顯示。

相關問題