我想保持在數據庫顯示順序一個整型字段,這將是唯一的(明顯)如何保持在PHP中顯示順序字段中
現在可以說我有10條記錄在數據庫中,如果我將更新第10條記錄,並將顯示順序從10設置爲1,因此所有記錄從1到9將遞增1,如 顯示順序1將變成2,2到3,3到4,4到5 ....
那麼如何保持這個?
想要任何優化解決方案,如果我們有1000條記錄,那麼我們無法爲所有999條記錄激發更新查詢。
請幫我
我想保持在數據庫顯示順序一個整型字段,這將是唯一的(明顯)如何保持在PHP中顯示順序字段中
現在可以說我有10條記錄在數據庫中,如果我將更新第10條記錄,並將顯示順序從10設置爲1,因此所有記錄從1到9將遞增1,如 顯示順序1將變成2,2到3,3到4,4到5 ....
那麼如何保持這個?
想要任何優化解決方案,如果我們有1000條記錄,那麼我們無法爲所有999條記錄激發更新查詢。
請幫我
你爲什麼不嘗試用函數或存儲過程 ..這兩個是不夠冷靜,處理這樣的情況..讓試用一下下面的一個..希望它會幫助你..
記得我正在考慮以下兩個參數
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"
哇,好極了,非常感謝 –
可以使用更大的值顯示,喜歡說:
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 + 1000000)/ 2 => 500 000 –
是指?請你能解釋一下嗎? –
您可以按任意順序顯示數據,而無需更改數據庫中的id
字段值。
我不認爲有必要向最終用戶顯示ID
的值,但僅用於內部參考。
你可以嘗試這樣的:
select * from my_table
order by field(id, 10), id asc
這將導致以獲取與頂部id
值10
和其他行未來在ascending
順序。
您可以在field
中指定任意數量的值以在結果上以該特定順序顯示。
你爲什麼要在數據庫中創建display_order列? – ripa
可以說假設我在我的網站上發佈產品,我有10個產品,並且想要改變顯示順序,所以對於這個我將使用我的這個字段「displayorder」 –