Mysql 使用SQL根据单个记录的更改对多个记录进行更改
我有一桌食物。它们有一个“位置”字段,表示它们在列表中的显示顺序(listID是它们所在的列表,我们不想在另一个列表中对项目重新排序) 我想说“将梨移到切屑之前”,这包括将梨的位置设置为位置1,然后将中间的所有位置增加1。所以我的结果表如下所示Mysql 使用SQL根据单个记录的更改对多个记录进行更改,mysql,node.js,Mysql,Node.js,我有一桌食物。它们有一个“位置”字段,表示它们在列表中的显示顺序(listID是它们所在的列表,我们不想在另一个列表中对项目重新排序) 我想说“将梨移到切屑之前”,这包括将梨的位置设置为位置1,然后将中间的所有位置增加1。所以我的结果表如下所示 +--id--+--listID--+---name---+--position--+ | 1 | 1 | cheese | 0 | | 2 | 1 | chips | 2
+--id--+--listID--+---name---+--position--+
| 1 | 1 | cheese | 0 |
| 2 | 1 | chips | 2 |
| 3 | 1 | bacon | 3 |
| 4 | 1 | apples | 4 |
| 5 | 1 | pears | 1 |
| 6 | 1 | pie | 5 |
| 7 | 2 | carrots | 0 |
| 8,9+ | 3,4+ | ... | ... |
+------+----------+----------+------------+
因此,我所需要做的就是从mytable中选择name,其中listID=1 ORDER BY position,这样我就可以按正确的顺序获得所有食物
是否可以通过一个查询来实现这一点?请记住,一条记录可能在列表中上移或下移,并且该表包含多个列表的记录,因此我们需要隔离listID
我对SQL的了解非常有限,所以现在我知道的唯一方法是选择id,从mytable中选择位置,其中listID=1,位置在1和5之间
,然后我可以使用Javascript(node.js)将位置5更改为1,并增加所有其他+1。然后更新我刚更改的所有记录
只是,每当我试图阅读所有人都在说的SQL内容时,都会避免多次查询,避免进行同步编码之类的事情
谢谢这需要一个复杂的查询来更新许多记录。但是,对数据的一点小小的更改就可以改变一些事情,这样就可以通过只修改一条记录的简单查询来实现
UPDATE my_table set position = position*10;
在过去,许多系统上的基本编程语言都有行号,它鼓励使用spagetti代码。许多人编写了GOTO line\u number
,而不是函数。如果您按顺序对行进行编号,并且必须添加或删除几行,则会出现真正的问题。人们是如何绕过它的?增加10行!这就是我们在这里所做的
那么你想让梨成为第二项
UPDATE my_table set position = 15 WHERE listId=1 AND name = 'Pears'
担心在多次重新订购后,项目之间的差距最终会消失?无所畏惧,只管去做
UPDATE my_table set position = position*10;
这需要一个复杂的查询来更新许多记录。但是,对数据的一点小小的更改就可以改变一些事情,这样就可以通过只修改一条记录的简单查询来实现
UPDATE my_table set position = position*10;
在过去,许多系统上的基本编程语言都有行号,它鼓励使用spagetti代码。许多人编写了GOTO line\u number
,而不是函数。如果您按顺序对行进行编号,并且必须添加或删除几行,则会出现真正的问题。人们是如何绕过它的?增加10行!这就是我们在这里所做的
那么你想让梨成为第二项
UPDATE my_table set position = 15 WHERE listId=1 AND name = 'Pears'
担心在多次重新订购后,项目之间的差距最终会消失?无所畏惧,只管去做
UPDATE my_table set position = position*10;
有时。我基本上已经解决了我的问题。所以我决定在这里给出一个答案,以防有人觉得它有用。 我可以在SQL中使用CASE语句。另外,通过预先使用Javascript构建SQL查询,我可以更改多个记录 这将生成我的SQL查询:
var sql;
var incrementDirection = (startPos > endPos)? 1 : -1;
sql = "UPDATE mytable SET position = CASE WHEN position = "+startPos+" THEN "+endPos;
for(var i=endPos; i!=startPos; i+=incrementDirection){
sql += " WHEN position = "+i+" THEN "+(i+incrementDirection);
}
sql += " ELSE position END WHERE listID = "+listID;
如果我想在切薯条之前把梨移到别的地方。我可以设置:
startPos = 4;
endPos = 1;
listID = 1;
我的代码将生成如下所示的SQL语句:
UPDATE mytable
SET position = CASE
WHEN position = 4 THEN 1
WHEN position = 1 THEN 2
WHEN position = 2 THEN 3
WHEN position = 3 THEN 4
ELSE position
END
WHERE listID = 1
我运行该代码,最终的表将如下所示:
+--id--+--listID--+---name---+--position--+
| 1 | 1 | cheese | 0 |
| 2 | 1 | chips | 2 |
| 3 | 1 | bacon | 3 |
| 4 | 1 | apples | 4 |
| 5 | 1 | pears | 1 |
| 6 | 1 | pie | 5 |
| 7 | 2 | carrots | 0 |
| 8,9+ | 3,4+ | ... | ... |
+------+----------+----------+------------+
在这之后,我所要做的就是运行从mytable中选择name,其中listID=1 ORDER BY position
,输出如下:
cheese
pears
chips
bacon
apples
pie
我基本上已经解决了我的问题。所以我决定在这里给出一个答案,以防有人觉得它有用。 我可以在SQL中使用CASE语句。另外,通过预先使用Javascript构建SQL查询,我可以更改多个记录 这将生成我的SQL查询:
var sql;
var incrementDirection = (startPos > endPos)? 1 : -1;
sql = "UPDATE mytable SET position = CASE WHEN position = "+startPos+" THEN "+endPos;
for(var i=endPos; i!=startPos; i+=incrementDirection){
sql += " WHEN position = "+i+" THEN "+(i+incrementDirection);
}
sql += " ELSE position END WHERE listID = "+listID;
如果我想在切薯条之前把梨移到别的地方。我可以设置:
startPos = 4;
endPos = 1;
listID = 1;
我的代码将生成如下所示的SQL语句:
UPDATE mytable
SET position = CASE
WHEN position = 4 THEN 1
WHEN position = 1 THEN 2
WHEN position = 2 THEN 3
WHEN position = 3 THEN 4
ELSE position
END
WHERE listID = 1
我运行该代码,最终的表将如下所示:
+--id--+--listID--+---name---+--position--+
| 1 | 1 | cheese | 0 |
| 2 | 1 | chips | 2 |
| 3 | 1 | bacon | 3 |
| 4 | 1 | apples | 4 |
| 5 | 1 | pears | 1 |
| 6 | 1 | pie | 5 |
| 7 | 2 | carrots | 0 |
| 8,9+ | 3,4+ | ... | ... |
+------+----------+----------+------------+
在这之后,我所要做的就是运行从mytable中选择name,其中listID=1 ORDER BY position
,输出如下:
cheese
pears
chips
bacon
apples
pie
我不认为这可以在少于两个查询中方便地完成,这是可以的,应该有尽可能少的查询,但不能以任何代价。这两个查询类似(基于您自己编写的内容)
我不认为这可以在少于两个查询中方便地完成,这是可以的,应该有尽可能少的查询,但不能以任何代价。这两个查询类似(基于您自己编写的内容)
你想要什么结果。@reds使我的表格看起来像我问题中的第二个例子,当我想把“Pears”移到“Chips”之前,你想让Pears成为你的第二行记录?这就是你的意思吗?@reds-嗯,“Pears”不一定需要移动记录。因为中间可能有任意数量的无关记录。我只需要更改“位置”字段,并相应增加任何相关记录的“位置”字段。@reds我更新了我的问题,希望我现在问的问题更清楚一点。你想要什么结果。@reds使我的表格看起来像我问题中的第二个示例,当我想将“梨”移到“芯片”之前你想让梨成为你的第二排记录吗?这就是你的意思吗?@reds-嗯,“Pears”不一定需要移动记录。因为中间可能有任意数量的无关记录。我只需要更改“位置”字段,并相应增加任何相关记录的“位置”字段。@我已经更新了一点我的问题,希望我现在问的问题更清楚一点。这个答案很聪明,几乎回答了我的问题。但是如果我现在试着在梨之前移动一些东西呢?是否有一种简单的方法来设置位置=12.5或其他?我觉得这也开始变得很复杂了。你不需要用小数。您可以将其设置为12。仍然只需要一个查询(借助连接)就可以进行更新。您能给我看一下q吗