我有一个列A为INT(11)的表(这是一个时间戳,但现在我只使用小数字)
id | A | diff |
---+----+------+
1 | 12 | |
2 | 7 | |
3 | 23 | |
4 | 9 | |
5 | 2 | |
6 | 30 | |我喜欢用diff更新A和最近的小邻居之间的区别。所以,如果是A=12,它的第一个小邻居是A=7,如果A=30是A=23。我应该得到这样一张桌子(按A排序):
id | A | diff |
---+----+------+
5 | 2 | - |
2 | 7 | 5 | (7-5)
4 | 9 | 2 | (9-7)
1 | 12 | 3 | (12-9)
3 | 23 | 11 | (23-12)
6 | 30 | 7 | (30-23)我可以在插入时计算出差异,就像我当时知道的A (这里:A=15):
INSERT INTO `table` (`A`,`diff`)
(SELECT 15 , 15-`A` FROM `table` WHERE `A` < 15 ORDER BY `A` DESC LIMIT 1)这导致了一项新的记录:
id | A | diff |
---+----+------+
7 | 15 | 3 | (3 being the difference between A=12 and A=15(注意:当A=1是新的最小值,没有更小的邻居,所以没有diff的值时,A=1就失败了)
但是现在diff在记录3中的值是错误的,因为它仍然是基于23 - 12之间的差异(现在应该是23 - 15 )。
因此,我只想插入A值,然后在表上运行一个更新,在必要的地方刷新diff。但这就是我对MYSQL的了解.
我构建了这个查询,但是它失败地说:“您不能指定表't1‘以便在FROM子句中进行更新
UPDATE `table` AS t1
SET
t1.`diff` = t1.`A` - (SELECT `A` FROM `table`
WHERE `A` < t1.`A`
ORDER BY `A` DESC LIMIT 1
) 发布于 2017-06-30 13:18:08
下面是一个查询:
SELECT x.*
, x.a-MAX(y.a) diff
FROM my_table x
LEFT
JOIN my_table y
ON y.a < x.a
GROUP
BY x.id
ORDER
BY a;我不知道你为什么要存储派生数据,但我可以猜.
UPDATE my_table m
JOIN
( SELECT x.*
, x.a-MAX(y.a) q
FROM my_table x
JOIN my_table y
ON y.a < x.a
GROUP
BY x.id
) n
ON n.id = m.id
SET m.diff = q;发布于 2017-06-30 14:19:43
在插入新值之后,您可以尝试这样做:
UPDATE x
SET
x.diff = iq2.new_diff
FROM
#t x
INNER JOIN
(SELECt id,A,diff , new_diff
FROM
(select id,A,15 as new_number,
CASE WHEN (A-15) < 0 THEN NULL ELSE (A-15) END as new_diff,diff
from #t
) iq
WHERE
iq.new_diff <= iq.diff
AND iq.new_diff <> 0
)iq2
on x.A = iq2.A内部查询比较以前的差异和当前的差异,然后更新相关的差异。
https://stackoverflow.com/questions/44847326
复制相似问题