用户选择对MySQL表行进行排序的最佳方法是什么?

时间:2014-04-14 04:12:33

标签: php mysql sorting

假设我们有一个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!所以现在我仍然寻找更好的答案!

3 个答案:

答案 0 :(得分:2)

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

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

然而,最简洁的方法就是这样(人们当然是一个非常简单的表格):

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

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

最后,我通过这种方法进行了排序:我创建了一个权重列。插入后的每一行都将其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次,浮动值也不会降到零,所以我现在解决这个问题了!