繁体   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