Mysql 根据上面和下面的值更新字段
我有一个如下所示的数据库:Mysql 根据上面和下面的值更新字段,mysql,sql-update,Mysql,Sql Update,我有一个如下所示的数据库: ┌────┬──────────┬────────────┐ │ id │ username │ reg_stmp │ ├────┼──────────┼────────────┤ │ 1 │ John │ 1605444385 │ │ 2 │ Alice │ │ │ 3 │ Peter │ 1605962778 │ └────┴──────────┴────────────┘ 我想更新该表,并根据16054443
┌────┬──────────┬────────────┐
│ id │ username │ reg_stmp │
├────┼──────────┼────────────┤
│ 1 │ John │ 1605444385 │
│ 2 │ Alice │ │
│ 3 │ Peter │ 1605962778 │
└────┴──────────┴────────────┘
我想更新该表,并根据1605444385以上和1605962778以下的值,用一个值填充缺少的日期
结果应该是介于和等于之间的任意数字,而不是超出此范围
更新
Mysql版本:5.5
具有空值的行可以重复,因此正确的值可以是上面或下面的多行。
ID之间存在间隙
┌────┬──────────┬────────────┐
│ id │ username │ reg_stmp │
├────┼──────────┼────────────┤
│ 1 │ John │ 1605444385 │
│ 2 │ Alice │ │
│ 3 │ Paola │ │
│ 6 │ Helen │ │
│ 7 │ Peter │ 1605962778 │
└────┴──────────┴────────────┘
考虑到表名是MT,下面的查询可以帮助您获得所有记录的结果
Update MT Set Reg_Stmp=Round(Rand()*((Select max(T.reg_stmp) From (Select * From MT) T Where T.ID>MT.ID)-(Select min(T.reg_stmp) From (Select * From MT) T Where T.ID<MT.ID))+(Select min(T.reg_stmp) From (Select * From MT) T Where T.ID<MT.ID),0)
Where MT.ID<>(Select Min(TT.ID) From (Select * From MT) TT) and MT.ID<>(Select Max(TT.ID) From (Select * From MT) TT)
您可以根据需要更改最小和最大操作。考虑到表名是MT,下面的查询可以帮助您获得所有记录的结果
Update MT Set Reg_Stmp=Round(Rand()*((Select max(T.reg_stmp) From (Select * From MT) T Where T.ID>MT.ID)-(Select min(T.reg_stmp) From (Select * From MT) T Where T.ID<MT.ID))+(Select min(T.reg_stmp) From (Select * From MT) T Where T.ID<MT.ID),0)
Where MT.ID<>(Select Min(TT.ID) From (Select * From MT) TT) and MT.ID<>(Select Max(TT.ID) From (Select * From MT) TT)
您可以根据需要更改“最小”和“最大”操作。您可以使用“滞后”替换,但正如您所看到的,LEAD要复杂得多,因此我只在最后一个已知的tmiestamp上加了10秒
dbfiddle您可以使用滞后替换,但正如您所看到的,潜在客户要复杂得多,因此我只在最后一次已知的tmiestamp上加了10秒
dbfiddle使用或您正在使用MySQL 8.0+谢谢@luk,我更新了添加版本信息。有多少带有空日期值的记录,它们应该以什么顺序更新?顺便说一句,标记你的版本,如5.5、5.6、5.7大约10.000如果带有空值的行是表中的第一行或最后一行怎么办?使用或你正在使用MySQL 8.0+Thank you@Luuk,我更新了添加的版本信息。有多少带有空日期值的记录,它们应该以什么顺序更新?顺便说一句,标记您的版本,如5.5、5.6、5.7,大约10.000如果带有空数字的行是表中的第一行或最后一行怎么办?谢谢JS Nasir,我知道您不能指定从clauseCheck更新的目标表'test_tbl':sqlfiddle.com/!9/1e5780/1i无法理解您的评论。我写了一个简单的sql查询,你的意思是解决方案有问题吗?Nasir我刚刚在我在上面的评论中写的链接中测试了它,并给出了错误。但是你测试的示例有不同的数据ThankJS Nasir,我知道你不能从clauseCheck中指定更新的目标表'test_tbl'。这里检查sql Fiddle:sqlfiddle.com/!9/1e5780/1i无法理解您的评论。我写了一个简单的sql查询,你的意思是解决方案有问题吗?Nasir我刚刚在我在上面的评论中写的链接中测试了它,并给出了错误。但是你测试的示例有不同的数据非常感谢nbk,这对我来说已经足够了。我可以从这里换成我想要的。谢谢大家非常感谢nbk,这对我来说已经足够了。我可以从这里换成我想要的。谢谢大家
UPDATE table2
INNER JOIN (select `id`,
@time := IF (`reg_stmp` IS NULL, @time + 10, `reg_stmp` ) tmptime
from table2,(SELECT @time := MIN(`reg_stmp`) FROM table2) a order by `id`
) a1
ON table2.id = a1.id
SET table2.`reg_stmp` = a1.tmptime
WHERE `reg_stmp` IS NULL
SELECT * FROM table2
id | username | reg_stmp
-: | :------- | ---------:
1 | John | 1605444385
2 | Alice | 1605444395
3 | Peter | 1605962778