Найти следующий / предыдущий номер в таблице mysql - PullRequest
0 голосов
/ 29 мая 2020

Учитывая эту таблицу:

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

Как я могу получить следующий (или предыдущий) номер элемента из таблицы после данного номера элемента с порядком таблицы - номер контракта AS C, номер элемента AS C ?

Например, я хотел бы получить следующий номер элемента после 100128 (100128) или предыдущий номер элемента до 100001 (100128).

Ответы [ 2 ]

1 голос
/ 29 мая 2020

В 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 .

1 голос
/ 29 мая 2020

Поскольку для каждого contractnumber могут существовать разные itemnumber s, это не так просто, как ORDER BY и LIMIT 1. Вы также должны проверить, соответствует ли следующий / предыдущий 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 .

...