带有子查询的 MySQL 条件更新

Posted

技术标签:

【中文标题】带有子查询的 MySQL 条件更新【英文标题】:MySQL conditional UPDATE with subquery 【发布时间】:2016-12-02 13:45:20 【问题描述】:

我想要实现的是:更新现有表,其中每行都有字段“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"

【问题讨论】:

【参考方案1】:

如果您将其转换为 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;

【讨论】:

不幸的是,它没有做它需要做的事情:这是一些示例数据:第 1 行:“walk_id 1059,order_id 0,walklist 8”,第 2 行:“walk_id 821,order_id 399,walklist 8", ROW 2: "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 2: "walk_id 821, order_id 2, walklist 8"

以上是关于带有子查询的 MySQL 条件更新的主要内容,如果未能解决你的问题,请参考以下文章

mysql:使用子查询更新,

MySQL--5子查询与连接小结

MYSQL子查询

带有子查询的 MySQL UPDATE TABLE 不会先执行子查询

mysql查询子查询连接查询

mysql 数据操作 子查询 介绍