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