Вот мой ответ. Я выбрал идею из ' Decent Dabbler ' и добавил часть, которая проверяет, находится ли id между min (id) и max (id). Вот часть для создания моей таблицы.
CREATE TABLE Users (
UserID int NOT NULL auto_increment,
UserName varchar(45),
UserNameID varchar(45),
PRIMARY KEY (UserID)
);
Следующим шагом является создание хранимой процедуры, которая отвечает за получение предыдущего идентификатора.
CREATE DEFINER=`root`@`localhost` PROCEDURE `printPreviousIDbySelectedIDUser`(
IN ID int,
IN search_name varchar(45)
)
BEGIN
SELECT CONCAT(ns.UserID) AS 'Previous ID' from Users ns
where ns.UserName=search_name AND ns.UserID IN (select min(ns.UserID) from Users ns where ns.UserID > ID
union select max(ns.UserID) from Users ns where ns.UserID < ID) LIMIT 1 ;
END
Первый способ хорош, если индексы отсортированы, но если нет. Например, если у вас есть индексы: 1,2,7, и вам нужно получить индекс № 2 таким способом, то лучше использовать другой подход.
CREATE DEFINER=`root`@`localhost` PROCEDURE `getPreviousUserID`(
IN ID int,
IN search_name varchar(45)
)
BEGIN
SELECT CONCAT(ns.UserID) AS 'Previous ID' from Users ns
WHERE ns.UserName=search_name AND ns.UserID < ID ORDER BY ns.UserID DESC LIMIT 1;
END