【问题标题】:PHP mysql ordering rowsPHP mysql 排序行
【发布时间】:2011-06-16 18:25:52
【问题描述】:

例如,我有一个如下所示的表格:

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

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

【问题讨论】:

  • 我认为问题是,你为什么要让约翰上位或亚当下位?是否需要在数据库中做出该决定的信息?如果按那个排序

标签: php mysql database row


【解决方案1】:

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

【讨论】:

  • 谢谢,我更新了我的帖子,对如何做到这一点提出了自己的看法,你能看看它是否有效吗?
  • 为什么在 SELECT 中使用 uId - 1 ?
  • 是否有可能或者这将是一个无效的查询? (我还没试过)(我现在把它设置为'+')
  • 无效...尝试update table set uId = uId - 1 where name = 'John'
  • 好吧,谢谢,我明天会尝试解决我的问题,因为我今天很累,我会在我的问题中添加我的解决方案......我现在要睡觉了......谢谢你回答
【解决方案2】:

更改id不是您想要做的。你永远不想弄乱你的主键,特别是因为以后会更容易(并且占用更少的空间,一个是int,另一个是varchar)使用他们的ID而不是他们的名字来引用你的用户来自其他表,很高兴拥有一个你知道永远不会改变的领域。

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

当您在barfoobar 之间移动foo 时,将fooorder 设置为barfoobarorderaverage

【讨论】:

  • 谢谢,但我不知道我是否理解你...顺便说一句,我用我的解决方案更新了我的问题,你能看看它是否对我有帮助吗?
  • 我刚醒来,所以我可能不应该优化任何查询,但如果它对你有用,那很好,我无法想象它会很慢。我的解决方案是,如果您想一次移动不止一个空间的人。
  • 不,在我的情况下,它一次只会将用户移动一个位置
  • 谢谢 :) 我稍微改了一下,让它看起来更好 :),你可以在我的问题底部看到代码
【解决方案3】:

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

【讨论】:

    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-09-06
        • 2012-04-09
        • 1970-01-01
        • 1970-01-01
        • 2013-05-12
        • 1970-01-01
        • 1970-01-01
        • 2016-08-12
        相关资源
        最近更新 更多