表格让我们称之为测试
----------------------------
| id | catid | value |
| 1 | 1 | 1 |
| 2 | 1 | 2 |
| 3 | 2 | 1 |
| 4 | 1 | 3 |
| 5 | 1 | 4 |
| 6 | 1 | 5 |
| 7 | 2 | 2 |
----------------------------
假设我从表中删除了第2行。现在表格将成为:
----------------------------
| id | catid | value |
| 1 | 1 | 1 |
| 3 | 2 | 1 |
| 4 | 1 | 3 |
| 5 | 1 | 4 |
| 6 | 1 | 5 |
| 7 | 2 | 2 |
----------------------------
所以在catid1
中,没有值2.因此,到目前为止,值将变为1,3,4,5 ...... ....
目标我需要将值更新为从之前的值中减去1,以便连续性得到维持(如果符合条件,则所有值都会增加1,即bgger是否超过删除的值)。
CODE 删除后,我正在尝试执行更新查询。
UPDATE `test`
SET `value` =
(
SELECT t.param FROM (
SELECT `value`-1 AS param
FROM `test`
WHERE
`catid` = 1 AND `value` > 2
) AS t
)
WHERE
`catid` = 1
AND `value` > 2
现在,最内部的查询将返回值> 2的所有行,其中更新需要字符串或数字的标量值。
所以问题是如何在最内层查询中返回与更新查询定位相关的行?
e.g。如果更新查询尝试更新ID为4的行,则最里面的查询将检索具有相同行ID 仅的value
列,并将其返回到外部查询(扣除1之后)
这有什么替代方法吗?
答案 0 :(得分:1)
JOIN
具有此子查询的表格如下:
UPDATE test t1
INNER JOIN
(
SELECT
id, catid, value - 1 AS value
FROM test
WHERE catid = 1
AND value > 2
) AS t2 ON t1.id = t2.id
SET t1.value = t2.value;
但是不需要这个子查询,你可以直接这样做:
UPDATE test t1
SET value = value - 1
WHERE catid = 1
AND value > 2;
<击>
但是,您可能需要修复该列id
以匹配以下值:
UPDATE test AS t1
INNER JOIN
(
SELECT
*,
(@rownum := @rownum + 1) AS newID
FROM test, (SELECT @rownum := 0) AS t
ORDER BY Id
) AS t2 ON t1.id = t2.id
SET t1.id = t2.newId,
t1.value = CASE
WHEN t1.catid = 1 AND t1.value > 2 THEN t2.value - 1
ELSE t1.value
END;
<击> 撞击>