首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >mysql序列交换值

mysql序列交换值
EN

Stack Overflow用户
提问于 2011-08-08 20:32:07
回答 3查看 132关注 0票数 0

数据库表

代码语言:javascript
运行
复制
id      serial      account     speeddialsort   dest
107     155         501         1               020341542
115     155         501         2               004407152222
116     155         501         3               00951242454
117     155         501         4               0794245544
118     266         700         1               004465652212
119     266         700         2               0044845482

这是帐户的501快速拨号插槽列表。如果需要,我可以从表单中发送快速拨号排序和dest,然后我可以使用什么sql方法来管理用户对快速拨号订单的编辑。

该顺序将向上或向下移动

代码语言:javascript
运行
复制
speeddialsort       dest
#1                  020341542
#2                  004407152222
#3                  00951242454
#4                  0794245544

例如,用户选择将快速拨号#3上移。#2和#3的快速拨号排序将需要交换

EN

回答 3

Stack Overflow用户

发布于 2011-08-08 20:40:57

我认为快速拨号排序是唯一的,而dest不是?

要为其提供sort_id的Asume $int_short和要作为该值的$int_previous_sort之前:

代码语言:javascript
运行
复制
INSERT INTO table (speeddialsort, dest)
SELECT speeddialsort, dest
FROM (SELECT {$int_sort} AS speeddialsort, dest
      FROM table
      WHERE speeddialsort = {$int_previous_sort}
      UNION ALL
      SELECT {$int_previous_sort}, dest
      FROM table
      WHERE speeddialsort = {$int_sort})
ON DUPLICATE KEY UPDATE dest = VALUES(dest)

如果两者都是唯一的,那么简单地删除和读取它们会更容易。或者:

代码语言:javascript
运行
复制
INSERT INTO table (speeddialsort, dest)
SELECT speeddialsort, dest
FROM (SELECT {$int_sort} AS speeddialsort, NULL AS dest
      UNION ALL
      SELECT {$int_previous_sort}, NULL
      UNION ALL
      SELECT {$int_sort}, dest
      FROM table
      WHERE speeddialsort = {$int_previous_sort}
      UNION ALL
      SELECT {$int_previous_sort}, dest
      FROM table
      WHERE speeddialsort = {$int_sort})
ON DUPLICATE KEY UPDATE dest = VALUES(dest)

应该也行得通。

票数 0
EN

Stack Overflow用户

发布于 2011-08-08 20:55:25

上移:

代码语言:javascript
运行
复制
UPDATE my_table AS t1 SET t1.dest =
    IFNULL( ( SELECT t2.dest FROM my_table AS t2 
      WHERE t2.speeddialsort IN( {$i}, {$i-1} ) AND
         t2.account = $account AND t2.dest <> t1.dest ), t1.dest )
    WHERE t1.speeddialsort IN( {$i}, {$i-1} ) AND t1.account = {$account}

要将下移,只需将$i-1%s替换为$i+1

($i是要移动的快速拨号排序,$account是帐户id)

票数 0
EN

Stack Overflow用户

发布于 2012-05-23 13:01:25

我创建了一个表,并使用mysql user defined variable.以连续的顺序生成行序列

ID序列

101 1

103 2

104 3

110 4

将序列号为4的项移动到2

代码语言:javascript
运行
复制
SET @a = 2;
UPDATE tableName SET serial = @a:=@a + 1 WHERE serial >= 2 AND serial < 4  
ORDER BY    serial DESC;
UPDATE tableName SET serial = 2 WHERE ID = 1;

此查询会将小于4且大于2的所有序列值加1,然后使用值2将序列号4更新为行。

并将第2项移至第4项

代码语言:javascript
运行
复制
SET @b = 4;
UPDATE tableName SET ord = @b:=@b - 1 WHERE  serial > 2 AND serial < (4 + 1)  
ORDER BY serial DESC;
UPDATE tableName SET serial = 4 WHERE ID = 1 ;

我不是在谈论自动递增,我的情况是我需要以required.So用户的身份对值进行排序,我不能使用Auto Increment.In。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6982161

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档