带有子查询的 MySQL 条件更新

标签 mysql sql subquery

我想要实现的是:更新一个现有表,其中每一行都有字段“order-id”(从 0 开始按顺序递增)。现在,如果一行被删除,我想确保“order-id”的一致性,即从 0 开始,递增 1。 示例:订单 ID 为 0、1、2、3 的行 - 然后订单 ID 为“2”的行被删除。我正在寻找确保订单不是“0,1,3”,而是按现有订单 ID 排序的“0,1,2”的 SQL 语句(因此子查询中的 ORDER BY)

这是我目前所拥有的 - 有效,但由于某种原因没有考虑 ORDER BY

UPDATE walklist_walks AS w, 
   (SELECT walk_id, order_id,@n := -1 
   FROM walklist_walks 
   WHERE walklist=8 
   ORDER BY order_id ASC) m
SET w.order_id = @n := @n + 1
WHERE w.walklist = 8 
AND w.walk_id=m.walk_id

这是一些示例数据:

   ROW 1: "walk_id 1059, order_id 0, walklist 8", 
   ROW 2: "walk_id 821, order_id 399, walklist 8", 
   ROW 3: "walk_id 91, order_id 45, walklist 8" 

运行查询后应该是这样的

   ROW 1: "walk_id 1059, order_id 0, walklist 8", 
   ROW 2: "walk_id 91, order_id 1, walklist 8", 
   ROW 3: "walk_id 821, order_id 2, walklist 8"

最佳答案

如果你把它转换成一个update-join结构会怎么样

UPDATE walklist_walks AS w JOIN 
   (SELECT walk_id, order_id,@n := -1 
   FROM walklist_walks 
   WHERE walklist=8 
   ORDER BY order_id ASC) m ON w.walk_id=m.walk_id
SET w.order_id = @n := @n + 1
WHERE w.walklist = 8;

关于带有子查询的 MySQL 条件更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40933656/

相关文章:

mysql - SQL 将延迟分钟的时间值更改为 "previous"分钟

php - 英镑和便士的定价问题!

mysql - 如果一个值为 NULL,则获取数据

mysql - 选择匹配子查询的两列

mysql - 根据 MySQL 中的条件更新不同的字段

php - 通过外列更新 MySQL 查询

mysql - Redmine安装: Mysql gem say undefined symbol: mysql_init

sql - 如何在选择语句 SQL Server 中将列名作为参数传递

javascript - SQL 模式与 NoSQL 命名空间

mysql - 对分组子查询求和