【问题标题】:How do I conditionally return a prediction of the next record's auto_increment value?一列中所有记录的mysql最大值
【发布时间】:2022-07-16 01:52:00
【问题描述】:

我不确定我正在尝试做的事情是否可以完成。我正在使用 MySQL 5.7.9。我希望我的查询为一个字段返回记录的值,或者,如果它为空,则比所有记录的该字段的最大值大一,包括未返回的记录。当我阅读 MAX() 函数的定义时,我认为这不是我所需要的。

例如,如果我有一张桌子

GO a
1 b
2 c
3 d
e

我想为第四条记录返回 4(因为该记录的 GO 为空,并且 4 比 3 大 1,GO 的最大值),并且对于每条其他记录,它们的 GO 值。

我尝试将 Max() 嵌套在 IFNULL() 中,但是对于 a = e 的情况,MAX(GO) 只是返回 NULL,因为 a=e 的所有记录都有一个 NULL GO 值。我想我所要求的实际上是将单独查询的结果放在这个查询中:
SELECT MAX(GO) FROM [TABLE]

我想我的例子过于简单化了。我的 GO 列实际上是一个 auto_incremented id 列,a 是连接表的外键。我真正要寻找的是,如果此表中没有记录与联接表的记录匹配,则为下一个 auto_increment 值。

【问题讨论】:

  • 您需要做的是发布示例数据和预期结果(作为文本)
  • 如果GO是auto_incremented列,怎么会是NULL,应该定义为not null

标签: mysql


【解决方案1】:

如果您的MySQL 支持窗口功能,您可以使用:

SELECT a, case when go is null then 1 + lag(go) OVER (ORDER BY a)  else go end as go
FROM test_tbl;

结果:

a go
a 1
b 2
c 3
d 4

演示:https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=9e7f54d06caa83be71bad3b2f364ece5

【讨论】:

    【解决方案2】:

    从中可以找到空列的值

    SELECT case when `go` is null then (SELECT max(`go`)+1 from `test`) else `go` end as `go` FROM `test`
    

    输出

    go
    1
    2
    3
    4
    

    然后通过在上面的查询中使用最大值,您将获得结果数据的最大值

    select max(`go`) from (SELECT case when `go` is null then (SELECT max(`go`)+1 from `test`) else `go` end as `go` FROM `test`) as tbl1
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-02
      • 1970-01-01
      • 2015-01-27
      • 1970-01-01
      • 1970-01-01
      • 2018-05-02
      相关资源
      最近更新 更多