PHP mysql ordering rows


PHP mysql ordering rows

例如,我有一个表,它看起来像这样:

id|name

1|Mike

2|Adam

3|John

4| Sarah…

现在,当我执行查询select * from table order by id desc时,它将输出如下内容:

4|Sarah

3|John

2|Adam

1|Mike

现在,如果我想上下移动John的行,或者上下移动Adam的行(使用MySQL查询(我需要一个基本的查询,只是想知道从哪里开始),我该怎么办。

我的解决方案:

首先,我创建了另一个名为orderID的列,它的值与id相同。

下面是一个向上移动用户的示例:

 $query = "
 SELECT  (
    SELECT orderID 
    FROM test WHERE id = 'user id that i want to move up'
    ) AS user_order,
    (
    SELECT orderID 
    FROM test WHERE orderID > user_order 
    ORDER BY orderID 
    LIMIT 0,1
    ) AS nextUser_order
 ";
 $result = mysql_query($query);
 $data = mysql_fetch_assoc($result);
 $query = "
 UPDATE test SET orderID = IF(orderID='{$data[nextUser_order]}', 
                  '{$data[user_order]}', '{$data[nextUser_order]}')
      WHERE orderID IN ('{$data[nextUser_order]}', '{$data[user_order]}');
 ";
 $result = mysql_query($query);

有更好的方法吗?

您必须切换ID,或者按另一列排序。这是唯一的办法。

更改id不是你想做的。你永远不想弄乱你的主键,尤其是因为以后更容易(占用更少的空间,一个是int,另一个是varchar)使用用户的id而不是其他表中的名称来引用你的用户,有一个你知道永远不会更改的字段是很好的。

将另一个字段(如order)作为floating point编号。

barfoobar之间移动foo时,将fooorder设置为baraveragefoobarorder

您可以将任意值放入查询中的order by子句中,但对于简单的"向上/向下移动一行"类型的东西,没有一个值可以轻松工作。您可以强制某些值排在第一位或最后一位,但不能"将该值放在该值之后,而是让该值进入其自然位置"。您需要有一个额外的字段来指定排序顺序。

SQL表并不是天生有序的,它们的行为实际上就像一个"行袋"。如果您希望结果按特定顺序排列,则在将它们从包中取出时需要对它们进行排序(使用ORDER BY ...)——否则,SQL server将按它认为最简单的顺序返回它们。(在这种情况下,它们的出现顺序与您插入它们的顺序相反,但这根本不能保证。)

您应该使用另一列来保存显示顺序。id只是一个唯一的标识符。在关系数据库中,由于相关表的更新,上下移动行可能会导致大量查询,因此我坚持为此定义一个特殊行的想法。