簡體   English   中英

用戶選擇對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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM