PHP mysql排序行

时间:2011-06-16 18:25:52

标签: php mysql database row

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

id |的名称

1 |麦克

2 |亚当

3 |约翰

4 |莎拉 ...

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

4 |萨拉

3 |约翰

2 |亚当

1 |麦克

如果我想向上或向下移动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);

有更好的方法吗?

5 个答案:

答案 0 :(得分:2)

您必须切换ID,或按其他列排序。这是唯一的方法。

答案 1 :(得分:1)

更改id 您要执行的操作。你永远不想搞砸你的主键,特别是因为在以后的路上它会更容易(占用更少的空间,一个是另一个varchar的int)来引用你的用户使用他们的id而不是他们的名字来自其他表有一个你知道永远不会改变的领域是很好的。

order之类的其他字段设为floating point

当您在foobar之间移动foobar时,请将foo的{​​{1}}设置为order averagebar的{​​{1}}。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

SQL表本身并不是有序的 - 它们有效地表现得像一个“行包”。如果您希望按特定顺序排列结果,则需要在将它们从包中取出时对它们进行排序(使用ORDER BY ...) - 否则,SQL服务器将以最简单的顺序返回它们。 (在这种情况下,它们按照你插入它们的相反顺序出现,但根本不保证。)

答案 4 :(得分:0)

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