2011-06-16 78 views
1

例如,我有一个表,看起来像这样:PHP的MySQL排序行

ID | 名称

1 | Mike

2 | Adam

3 | John

4 |萨拉 ...

现在,当我执行查询select * from table order by id desc它将输出是这样的:

4 | Sarah

3 | John

2 |亚当

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); 

有没有更好的方式来做到这一点?

+0

我想问的是,你为什么要约翰被抬起来或亚当下降?是否需要在数据库中做出该决定的信息?如果这是排序 – ben 2011-06-16 18:43:07

回答

2

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

+0

谢谢,我更新我的帖子与我的意见如何做到这一点,你能看看它是否会工作? – John 2011-06-16 18:49:05

+0

你为什么在SELECT中使用uId - 1? – genesis 2011-06-16 18:53:45

+0

是否有可能或者这将是一个无效的查询? (我还没有尝试过)(我现在设置为'+') – John 2011-06-16 19:02:53

0

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

0

SQL表不是固有排序的 - 它们有效地表现为“行包”。如果你想按照特定的顺序得到结果,当你将它们从包里取出时,你需要对它们进行排序(使用ORDER BY ...) - 否则,SQL服务器将以任何它感觉最简单的顺序返回它们。 (在这种情况下,它们以与插入它们相反的顺序出现,但这并不能保证。)

0

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

1

更改id而不是你想要做什么。你永远不想混淆你的主键,特别是因为在后面的路上它会更容易(并占用更少的空间,其中一个是int而另一个是varchar)来引用用户的ID而不是其他表的名字,很高兴有一个你知道永远不会改变的领域。

使另一个字段如order作为floating point的数字。

当您移动barfoobar之间foo,设置fooorderbaraveragefoobarorder

+0

谢谢,但我不知道我是否了解你... btw我用我的解决方案更新了我的问题,可否看看它是否可以帮助我? – John 2011-06-17 09:55:14

+0

我刚刚醒来,所以我可能不应该优化任何查询,但如果它适合你,这是好的,我无法想象它非常缓慢。我的解决方案是,如果您想一次只移动一个空间以上的空间。 – 2011-06-17 16:24:09

+0

不,在我的情况下,它会一次只移动一个位置的用户 – John 2011-06-17 17:13:01