数据表结构如下:
id             name    order_id     记录
int(递增)    string     int         第几条记录
当插入数据的时候让order_id=id
当取出的时候order by order_id
假如取出的记录如下:
记录1  (此时他的order_id是1)
记录2  (此时他的order_id是2)
记录3  (此时他的order_id是3)
记录4  (此时他的order_id是4)
记录5  (此时他的order_id是5)
.....
记录X  (此时他的order_id是X)
现在的问题是如果要让他显示的顺序是:
记录1
记录5
记录2
记录3
记录4
....
记录X
应该如何修改记录5的order_id呢?
我想了两种办法都好象有问题
1,把记录5的order_id改成2,把order_id从3开始都加1,这样如果数据量大那就完了
2,把记录5的order_id改成记录2的order_id-0.001,也就是改成1.999,同时把order_id设置为float,
但是这也有个问题,如果这个时候再把记录6放到记录2的前面的话那记录6的order_id也就成了记录2的order-id-1,也就是成了1.999,出现了两个相同的order_id那排序就是空话拉
应该怎么样解决呢?
可以解决吗?
请指教,谢谢!!!

解决方案 »

  1.   

    其实很简单了update tablename set order_id = order_id + 1 where order_id > 2
    就是先把 大于 2 的 order_id 都加以 就是向下移动,然后在修改就可以了。
    置于数据量大,可以先不考虑的或者是做个实验,看看到底能慢到什么程度。
      

  2.   

    再加一列(例如列名为SortID),默认值为0,记录5的那一列值为1,排序时Order By SortID, Order_ID
      

  3.   

    Snowdust(雪尘) :
    可以请你再说详细点吗?
      

  4.   

    id             name    order_id     sortid
    1             记录1      1            1
    2             记录2      2            0
    3             记录3      3            0
    4             记录4      4            0
    5             记录5      5            1sortid是辅助列,是不用显示的列,目的只是为了排序。
    Select * From table Order By sortid, orderid
      

  5.   

    换个思路,不交换ID,交换ID所对应的数据 ,在查询语句中用个临时表保存要交换的行的数据,然后UPDATE………………
      

  6.   

    你的表中是有一个“记录”字段,你说明为“第几条记录”你为什么没使用这个字段呢?这个字段似乎和order_id功能重复
    如果按照我的猜测:移动记录后,下次要记住记录的位置,那么你不得不操作数据库了。不知道是不是这样?疑问多多。你提问反倒变成我问你了,反客为主了,哈哈。
      

  7.   

    不管你的目的了,就在你的下面的方法下我来拟出一个优化方案:
    1,把记录5的order_id改成2,把order_id从3开始都加1,这样如果数据量大那就完

    我的优化方案:order_id的初值为
    100
    200
    300
    400
    500
    .
    .
    .那么将500这条记录移到200之前100之后的做法为:
    如果200与100相等(这应该是在100和200之间插入了100次后才会出现的情况,很难出现这种情况),将所有的order_id乘100,否则
    (200 + 100)/2 取整 为了以前500的新的order_id值更新它这样更新所有order_id的几率是很小的,看你的实际情况,估计一般不会出现
    所以通常情况只更新了一个order_id的值,绝对效率很高注意这里int的最大值为2147483647 也就是除以100能存2百多万的数据
    如果你的数据超过200万,你应考试使用bigint
      

  8.   

    取ID不等5的数据排序后,单独把ID为5的用程序加入到第二行
      

  9.   

    你仔细看看我的方法,看明白了,然后再作决定,或者再讨论。(200 + 100)/2 取整 为了以前500的新的order_id值更新它这句改成(200 + 100)/2 取整 后更新以前order_id=500值
      

  10.   

    我也不明白10W条数据为什么要有这样的设计……如果仅仅是显示上可以选择先后,那么数据量应该不多,set order_id = order_id + 1就够了。10W条数据应该不是用于显示吧?那么为什么要一个这样的order呢?
      

  11.   

    数据可能不是10W吧
    假设10W只是所有数据的一个0条吧
    为什么要这样设计呢?
    因为就比如ie的收藏夹
    每个用户都可能有上1000条记录吧
    如果用户一多,每个用户都给他建个表是不可以的
    所以把他们全部放到一个表中至于YX,你的方法很好
    但是我好象无法得到上一条数据的order-id
    比如我拖动第五条到第二条前面
    我只能够得到第二条的order-id
    而可能无法得到排在第二条前面的那记录的order-id
    谢谢
      

  12.   

    前一条记录的order_id在界面上很容易得到,这个你不用担心。
      

  13.   

    YX
    我真想不通前一条记录的order-id怎么很容易找到
    如果真的很容易的话那就好了啊
    只是不能够帖图
    如果能够帖图的话那我就能够说的一清二楚拉
    谢谢
      

  14.   

    我现在又想到了一个办法,请大家看看,不知道可以吗?有什么优化方发呢?
    数据记录理论上说应该是无穷大,但是对于单个用户来说他的记录最多应该不会超过2000条
    第一条记录    order_id=1
    第二条记录    order_id=2
    第三条记录    order_id=3
    第四条记录    order_id=4
    第五条记录    order_id=5
    第六条记录    order_id=6
    ..................
    如果把第五条记录插到第二条记录的前面
    一>.我先找到第二条记录的order-id值2,
    二>.然后根据第二条记录的order-id值2找到第一个order_id小
        于2的那条记录,把他的order_id+1,如果等于第二条记录的order-id,那么就把大于order_id>=2
    的所有的有关这个用户的order_id修改成+1,然后把第五条的order_id设为2不知道这样可以吗?>
      

  15.   

    如果order_id+1<第二条记录
    就直接把第五条记录的order_id = 第二条记录的order_id-1
      

  16.   

    呵呵
    谢谢
    我还加了个parent_id
    给相同用户的数据分下组
    就不多拉
    谢谢
    结帐
      

  17.   

    加个字段sortidupdate sortid=order_id把第五条记录sortid=第1条记录order_id
    order by sortid,order_id
      

  18.   

    YiYanXiYin(手艺不好怪工具) 那个方法,取前一条ID确实好取,例如200的前一条当然就是where order_id<200 order by order_id desc的top 1啦。问题是,如果在100~200之间插入满了,就要全部*100这个做法,很容易让int甚至bigint用完的哦。如果楼主的情况是如你所说,多个用户公用一个收藏夹,然后这个order仅仅是针对单用户的而不是针对多用户的,并且保证每个用户只有1000条数据左右。那么如果能够做到在单用户数据范围内实施换位的两个order_id之间order_id = order_id + 1,可以吗?1000条数据,对于这个来说可以承受吧?方法很简单,假设你的user_id是int,假设你允许单个用户存储9999条数据,那么你的order_id改为user_id * 1000 + order_id,这样,就保存每一个用户的order_id都是连续存储的,如果他要交换order也仅仅影响他自己的记录,中间不会有别人的order_id。
      

  19.   

    不好意思,打少了一个零,应该是“那么你的order_id改为user_id * 10000 + order_id”
      

  20.   

    bigint用完了,估计你的100000G的硬盘都用完了,你好好看看bigint的值是多大????
      

  21.   

    2的10次方 1k
    2的20次方 1M
    2的30次方 1G
    2的31次方 2G
    2的32次方 4G
    2的40次方 1000G = 1T
    2的50次方 1000000G = 1?
    2的64次方 ?????????? 这就是bigint
    还是这么多条记录,一条记录才仅仅1B吗?
      

  22.   

    我觉得只是把纪录2--5的id改一下而已,别的不用动,纪录2及以下的id+1,纪录5的id=2就行了