在 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
可能存在不同的 itemnumber
s 它不像 ORDER BY
和 LIMIT 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 中的 运行 示例。
鉴于此 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
可能存在不同的 itemnumber
s 它不像 ORDER BY
和 LIMIT 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 中的 运行 示例。