Mysql 从ID列表更新订单列
我有一个N个ID的列表,例如:MySQL服务器5.7.24上的803518361 当前值为Mysql 从ID列表更新订单列,mysql,Mysql,我有一个N个ID的列表,例如:MySQL服务器5.7.24上的803518361 当前值为 +-----+-------+ | id | order | +-----+-------+ | 361 | 1 | | 518 | 2 | | 803 | 3 | +-----+-------+ 我想从id列表中更新订单列,从id位置获取订单 此查询为每个id返回正确的rownum: 选择'id',@rownnumber:=@rownnumber+1`rownum` 来自`评
+-----+-------+
| id | order |
+-----+-------+
| 361 | 1 |
| 518 | 2 |
| 803 | 3 |
+-----+-------+
我想从id列表中更新订单列,从id位置获取订单
此查询为每个id返回正确的rownum:
选择'id',@rownnumber:=@rownnumber+1`rownum`
来自`评论`
交叉连接选择@rownumber:=0`CROSS`
其中'id'在803、518、361中
按字段'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`;
下面的查询应该可以做到这一点:
SET @rownumber = 0;
UPDATE comments
SET `order` = @rownumber:= @rownumber + 1
WHERE id IN (803, 518, 361)
ORDER BY id DESC;
在我处理PHP查询时,请参见,这要感谢@GMB with idea about run两个不同的语句: $db->exec'SET@rownumber=0;'; $db->exec' 更新“评论”` 设置“顺序”=@rownumber:=@rownumber+1 其中'id'在803、518、361中 按字段'id',803,518,361 ASC排序; '; 由于id是主键,您只需执行以下操作:
UPDATE `comments`
SET `order` = field(`id`,
803,
518,
316)
WHERE `id` IN (803,
518,
361);
字段已生成1、2或3。我无法重现您的错误,它对我有效。@p.Salmon噢,这很奇怪。。。我有一个SQL上有固定id的脚本要在一行中执行以进行测试,但它不起作用。第一个查询中的字段id为803、518、361,而第二个查询中的字段id为803、518、361-这是您发布的副本中的错误还是您实际使用的代码中的错误?@stickybit发现得很好,@stickybit是复制粘贴错误。在我的代码中,我使用的是字段id 803518361。我不能这样做,因为它来自一个PHP脚本,我一次只能执行一个查询。不允许多次查询。是你的朋友@LitoI,我正在使用PDO@利托:好的,那么您可以简单地运行这两条语句,一条接一条,在这里的另一个示例中: