![](/img/trans.png)
[英]What is the best approach to list a user's recent activities in PHP/MySQL?
[英]What is the best approach to sort MySQL table rows by user choice?
假設我們有一個MySQL表(id,name)和一個支持拖放的列表視圖。 用戶拖動第90行並將其放在第10行。 保持這種新排序的最佳方法是什么?
I do not mean to keep sorting for every use separately
The HTML/JavaScript is not the problem
我見過一些程序員在表中添加一個權重列,在表中設置較低的數字。 在我的示例中,它將是1到100. 問題是在上述示例(90到10)的情況下,需要更新81行。 90改為10,每增加10到89。 它在MySQL中有效嗎? 有沒有更好的解決方案?
另一種方法可能是將新訂單保存為另一個表中的字符串, 但在這種情況下,我們會在檢索階段丟失MySQL排序!
我記得當我們在大學里學習樹形結構作為索引工具時,我們說哇! 即使我們利用一個字節的每一位,1.5 GB的純文本數據存儲在不到500KB! 所以現在我仍然尋找更好的答案!
更新在先前占用的索引中添加了對象的數組的索引時,即使編程語言也會為每個索引添加一個。
您將不得不最終更新每一行的索引。
然而,最干凈的方法就是這樣(當然人們是一個非常簡單的表格):
UPDATE people
SET index = index + 1
WHERE index BETWEEN $newIndex AND $oldIndex;
根據您的數據庫,可能包括或排除上限和下限數字。 只要確保你知道如何對待他們!
而不是向MYSQL表添加weight
列,而是向表中添加next_object
列。
它的功能類似於鏈表(如果您熟悉它)。 輸入的每個對象都將指向下一個對象。
讓我們來看看將位置90對象移動到位置10的場景。
首先,您需要更新第89個對象,使其現在指向第91個對象(新的第90個對象)
然后,您需要更新第9個對象,並指向第90個對象(新的第10個對象)
最后,您需要更新第90個對象(新的第10個對象),並指向第10個對象(新的第11個對象)
當然,我的意思是,將next_object
字段更新為我說我指向的對象。
你究竟能把它作為一個值放在next_object
字段中? 只是對象的ID,或類似的東西。
當我開始寫這個答案時,我只是想出了這個系統,所以我不確定這是最有效的方法。 但是,嘿,更新3個對象比潛在的100,000個更好(如果你有100,000個對象)。
最后,我通過這種方法進行了排序:我創建了一個權重列。 插入后的每一行都將其id作為權重值。 它確保新行將結束。 重量欄是FLOAT的類型。 Jquery有助於獲取行的新位置,以及prev()和next()表行。 正確的新版本我們有三種情況在下面的代碼片段中進行了注釋(從行中檢索ID並將Ajax發送到PHP之后):
#table of DB
$table = $_POST['table'];
#the id of the row on top
$t = $_POST['t'];
#the id of the row on middle
$m = $_POST['m'];
#the id of the row on bottom
$b = $_POST['b'];
switch ('') {
#top is empty, so the row is droped on top
case $t:
#we set middle weigh 0.5 lower than its bottom
$query = "
UPDATE `$table` m, `$table` b
SET m.`weight` = b.`weight`-0.5
WHERE m.`id` = $m
AND b.`id` = $b
";
break;
#bottom is empty, so the row is droped on the end
case $b:
#we set middle weigh 0.5 upper than its top
$query = "
UPDATE `$table` m, `$table` t
SET m.`weight` = t.`weight`+0.5
WHERE m.`id` = $m
AND t.`id` = $t
";
break;
#values are not empty, so the row is droped in the middle part
default:
#we set middle weigh exactly between top and bottom
$query = "
UPDATE `$table` m, `$table` t, `$table` b
SET m.`weight` = (t.`weight`+b.`weight`)/2
WHERE m.`id` = $m
AND t.`id` = $t
AND b.`id` = $b
";
break;
}
Yii::app()->db->createCommand($query)->query();
即使經過45次除1到2次,浮點值也不會降到零,所以我這個解決方案現在就是一個補救措施!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.