在 mysql table 中查找下一个/上一个数字

Find next / previous number in mysql table

鉴于此 table:

contractnumber | itemnumber
1234           | 100151
1234           | 100152
1235           | 100127
1235           | 100128
1236           | 100001
1236           | 100002

如何从 table 中获取下一个(或前一个)项目编号,在给定的项目编号后 table 订单是 contractnumber ASC,itemnumber ASC?

例如我想获取 100128 之后的下一个项目编号 (100128) 或前一个项目编号到 100001 (100128)。

因为每个 contractnumber 可能存在不同的 itemnumbers 它不像 ORDER BYLIMIT 1.
那样简单 您还必须检查 next/previous itemnumber 是否具有相同的 contractnumber

100128的上一项:

select
  coalesce(
    (
      select min(itemnumber) from tablename 
      where contractnumber = (
        select contractnumber from tablename 
        where itemnumber = 100128
      ) and itemnumber > 100128
    ),
    (
      select itemnumber from tablename
      where contractnumber > (
        select contractnumber from tablename 
        where itemnumber = 100128
      )
      order by contractnumber, itemnumber limit 1
    )  
  ) itemnumber

对于 100001 的下一项:

select
  coalesce(
    (
      select max(itemnumber) from tablename 
      where contractnumber = (
        select contractnumber from tablename 
        where itemnumber = 100001
      ) and itemnumber < 100001
    ),
    (
      select itemnumber from tablename
      where contractnumber < (
        select contractnumber from tablename 
        where itemnumber = 100001
      )
      order by contractnumber desc, itemnumber desc limit 1
    )  
  ) itemnumber

参见demo

在 MySQL 5.x 中不能使用 LEAD()LAG()。但是,您可以对行进行排序并将结果集限制为 1 行。见下文

对于100128下一个元素,您可以使用:

select *
from t
where (contractnumber, itemnumber) > (
  select contractnumber, itemnumber from t where itemnumber = 100128
)
order by contractnumber, itemnumber 
limit 1;

结果:

contractnumber  itemnumber
--------------  ----------
          1236      100001

对于100128前一个元素,您可以使用:

select *
from t
where (contractnumber, itemnumber) < (
  select contractnumber, itemnumber from t where itemnumber = 100128
)
order by contractnumber desc, itemnumber desc
limit 1;

结果:

contractnumber  itemnumber
--------------  ----------
          1235      100127

参见 DB Fiddle 中的 运行 示例。