Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 使用SQL根据单个记录的更改对多个记录进行更改_Mysql_Node.js - Fatal编程技术网

Mysql 使用SQL根据单个记录的更改对多个记录进行更改

Mysql 使用SQL根据单个记录的更改对多个记录进行更改,mysql,node.js,Mysql,Node.js,我有一桌食物。它们有一个“位置”字段,表示它们在列表中的显示顺序(listID是它们所在的列表,我们不想在另一个列表中对项目重新排序) 我想说“将梨移到切屑之前”,这包括将梨的位置设置为位置1,然后将中间的所有位置增加1。所以我的结果表如下所示 +--id--+--listID--+---name---+--position--+ | 1 | 1 | cheese | 0 | | 2 | 1 | chips | 2

我有一桌食物。它们有一个“位置”字段,表示它们在列表中的显示顺序(listID是它们所在的列表,我们不想在另一个列表中对项目重新排序)

我想说“将梨移到切屑之前”,这包括将梨的位置设置为位置1,然后将中间的所有位置增加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,这样我就可以按正确的顺序获得所有食物

是否可以通过一个查询来实现这一点?请记住,一条记录可能在列表中上移或下移,并且该表包含多个列表的记录,因此我们需要隔离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吗