После редактирования вопроса и упрощения ниже, мы можем изменить его на
SELECT id FROM table WHERE fruit > 'apples' ORDER BY fruit LIMIT 1
SELECT * FROM table WHERE id > 1 ORDER BY id LIMIT 1
Еще более простой
ОБНОВЛЕНИЕ:
SELECT * FROM table WHERE fruit > 'apples' ORDER BY fruit LIMIT 1
Настолько простой, и никакая гимнастика потребовал
Select * from Table
where id =
(Select Max(id) from Table
where id < @Id)
или, на основе строки @fruitName = 'яблоки' или 'апельсины' и т.д.
Select * from Table
where id =
(Select Max(id) from Table
where id < (Select id from Table
Where fruit = @fruitName))
Если Вы не указываете порядок сортировки, я не верю понятию "предыдущих", или "следующие" доступны Вам в SQL. Вам не гарантирует особого порядка RDBMS по умолчанию. Если можно отсортировать по некоторому столбцу в порядке возрастания или убывания, это - другой вопрос.
Это должно работать. Строка 'яблоки' должна будет быть параметром.
Заполняют тот параметр со строкой, и этот запрос возвратит всю запись для первых фруктов после тот объект в алфавитном порядке.
В отличие от ПРЕДЕЛА 1 подход, это должно быть платформенно независимо.
--STEP THREE: Get the full record w/the ID we found in step 2
select *
from
fruits fr
,(
--STEP TWO: Get the ID # of the name we found in step 1
select
min(vendor_id) min_id
from
fruits fr1
,(
--STEP ONE: Get the next name after "apples"
select min(name) next_name
from fruits frx
where frx.name > 'apples'
) minval
where fr1.name = minval.next_name
) x
where fr.vendor_id = x.min_id;
эквивалент ПРЕДЕЛУ 1 подход в Oracle (только для ссылки) был бы этим:
select *
from
(
select *
from fruits frx
where frx.name > 'apples'
order by name
)
where rownum = 1
Я не знаком с синтаксисом MySQL, но с SQL Server можно сделать что-то с "вершиной", например:
SELECT TOP 1 * FROM table WHERE id > 1 ORDER BY id;
Это предполагает, что идентификационное поле уникально. Если это не уникально (скажите, внешний ключ), можно сделать что-то подобное и затем присоединиться назад против той же таблицы.
, Так как я не использую MySQL, я не уверен в синтаксисе, но предположил бы, что это подобно.
Я не знаю MySQL SQL, но я все еще пробую
select n.id
from fruit n
, fruit p
where n.id = p.id + 1;
редактирование:
select n.id, n.fruitname
from fruits n
, fruits p
where n.id = p.id + 1;
редактирование два:
Jason Lepack сказал, что это не работает, когда существуют разрывы, и это верно, и я должен считать вопрос лучше.
я должен был использовать аналитику для сортировки результатов на fruitname
select id
, fruitname
, lead(id) over (order by fruitname) id_next
, lead(fruitname) over (order by fruitname) fruitname_next
from fruits;
Как насчет этого:
Select * from table where id = 1 + 1