【问题标题】:What is the best approach to sort MySQL table rows by user choice?按用户选择对 MySQL 表行进行排序的最佳方法是什么?
【发布时间】:2014-05-27 22:12:21
【问题描述】:

假设我们有一个 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 排序!

我记得我们在大学里学习 trie 树结构时 索引工具,我们说哇!即使我们利用每一个 一个字节的一位,1.5GB的纯文本数据存储在小于 500KB!!!所以现在我还在寻找更好的答案!

【问题讨论】:

    标签: php mysql sorting


    【解决方案1】:

    即使是编程语言在更新数组的索引时,在先前占用的索引中添加了一个对象,也会为每个索引添加一个。

    您最终将不得不更新每一行的索引。

    然而,最干净的方法是这样的(当然,人是一张不平凡的桌子):

    UPDATE people
    SET index = index + 1
    WHERE index BETWEEN $newIndex AND $oldIndex;
    

    根据您的数据库,可能包括或排除上限和下限数字。只要确保你知道它是如何对待他们的!

    【讨论】:

    • 谢谢,目前我确定没有更好的解决方案,我开始实施重量解决方案。我还在努力!
    【解决方案2】:

    不是在 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 个对象)要好。

    【讨论】:

    • 我猜你的意思是Linked List,而不是Stack。我之前也想过,但在这种情况下,我们在检索阶段丢失了 MySQL 排序!
    • 我发布了另一个答案。
    【解决方案3】:

    最后,我通过这种方法进行了排序:我创建了一个权重列。插入后的每一行都将其 id 作为权重值。它确保新行将结束。 weight 列是 FLOAT 类型。 Jquery 有助于获取行的新位置,以及 prev() 和 next() 表行。新的我们在闲散的 sn-p 中注释了三种情况(在从行中检索 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,float 值也不会下降到零,所以我这个解决方案现在是一个补救措施!

    【讨论】:

      猜你喜欢
      • 2011-11-22
      • 1970-01-01
      • 2010-12-16
      • 1970-01-01
      • 2021-08-28
      • 1970-01-01
      • 1970-01-01
      • 2013-07-07
      • 2021-01-04
      相关资源
      最近更新 更多