Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.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 从ID列表更新订单列_Mysql - Fatal编程技术网

Mysql 从ID列表更新订单列

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` 来自`评

我有一个N个ID的列表,例如:MySQL服务器5.7.24上的803518361

当前值为

+-----+-------+
| 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@利托:好的,那么您可以简单地运行这两条语句,一条接一条,在这里的另一个示例中: