【发布时间】:2019-01-15 04:16:26
【问题描述】:
我在 MySQL 服务器 5.7.24 上有一个 N 个 ID 的列表(例如:803、518、361)
当前值为
+-----+-------+
| id | order |
+-----+-------+
| 361 | 1 |
| 518 | 2 |
| 803 | 3 |
+-----+-------+
我想从 id 列表中更新 order 列,从 id 位置获取订单。
此查询为每个id 返回正确的rownum:
SELECT `id`, (@rownumber := @rownumber + 1) `rownum`
FROM `comments`
CROSS JOIN (SELECT @rownumber := 0) `cross`
WHERE `id` IN (803, 518, 361)
ORDER BY FIELD (`id`, 803, 518, 361) ASC;
+-----+--------+
| id | rownum |
+-----+--------+
| 803 | 1 |
| 518 | 2 |
| 361 | 3 |
+-----+--------+
但在更新时,此位置未设置:
UPDATE `comments` `target`
JOIN (
SELECT `id`, (@rownumber := @rownumber + 1) `rownum`
FROM `comments`
CROSS JOIN (SELECT @rownumber := 0) `cross`
WHERE `id` IN (803, 518, 361)
ORDER BY FIELD (`id`, 803, 518, 361) ASC
) `source` ON `target`.`id` = `source`.`id`
SET `target`.`order` = `source`.`rownum`;
Query OK, 0 rows affected (0.00 sec)
Rows matched: 3 Changed: 0 Warnings: 0
订单值未更新:
SELECT `id`, `order` FROM `comments`
WHERE `id` IN (361, 518, 803)
ORDER BY `order` ASC;
+-----+-------+
| id | order |
+-----+-------+
| 361 | 1 |
| 518 | 2 |
| 803 | 3 |
+-----+-------+
3 rows in set (0.01 sec)
查询的问题在哪里?
谢谢!
更新 1:
同样,不工作
UPDATE `comments` `target`, (
SELECT `id`, (@rownumber := @rownumber + 1) `rownum`
FROM `comments`
CROSS JOIN (SELECT @rownumber := 0) `cross`
WHERE `id` IN (803, 518, 361)
ORDER BY FIELD (`id`, 803, 518, 361) ASC
) `source`
SET `target`.`order` = `source`.`rownum`
WHERE `target`.`id` = `source`.`id`;
【问题讨论】:
-
我无法重现您的错误,它对我有用。
-
@P.Salmon 哦,这很奇怪...我有一个脚本,在 SQL 上具有固定的 ID,要连续执行进行测试,但无法正常工作。
-
FIELD (id, 803, 518, 361)在第一个查询中与FIELD (803, 518, 361)在第二个查询中 - 这是您发布的副本中的错误还是您实际使用的代码中的不同? -
@sticky 位很好,
-
@stickybit 是复制和粘贴错误。在我的代码中,我使用的是
FIELD (id, 803, 518, 361)。
标签: mysql