Ответ 1
После редактирования вопроса и упрощения ниже мы можем изменить его на
SELECT id FROM table WHERE fruit > 'apples' ORDER BY fruit LIMIT 1
Я хотел бы использовать один SQL-запрос (в MySQL), чтобы найти запись, которая приходит после той, которую я указываю.
I.e., если таблица имеет:
id, fruit
-- -----
1 apples
2 pears
3 oranges
Я хотел бы сделать запрос типа:
SELECT * FROM table where previous_record has id=1 order by id;
(ясно, что не настоящий синтаксис SQL, я просто использую псевдо-SQL, чтобы проиллюстрировать, чего я пытаюсь достичь)
который вернется:
2, pears
Мое текущее решение - это просто взять все записи и просмотреть их на PHP, но это медленнее, чем хотелось бы. Есть ли более быстрый способ сделать это?
Я был бы доволен тем, что возвратило две строки - то есть с указанным значением и следующей строкой.
EDIT: Извините, мой вопрос был плохо сформулирован. К сожалению, мое определение "следующий" не основано на ID, а на алфавитном порядке имени фруктов. Следовательно, мой пример выше неверен и должен возвращать апельсины, поскольку он идет в алфавитном порядке после яблок. Есть ли способ выполнить сравнение строк, а не идентификаторов?
После редактирования вопроса и упрощения ниже мы можем изменить его на
SELECT id FROM table WHERE fruit > 'apples' ORDER BY fruit LIMIT 1
SELECT * FROM table WHERE id > 1 ORDER BY id LIMIT 1
Еще проще
UPDATE:
SELECT * FROM table WHERE fruit > 'apples' ORDER BY fruit LIMIT 1
Я не знаком с синтаксисом MySQL, но с SQL Server вы можете что-то сделать с помощью "top", например:
SELECT TOP 1 * FROM table WHERE id > 1 ORDER BY id;
Это предполагает, что поле id уникально. Если он не уникален (например, внешний ключ), вы можете сделать что-то подобное, а затем присоединиться к той же таблице.
Так как я не использую MySQL, я не уверен в синтаксисе, но представляю, что это похоже.
Если вы не укажете порядок сортировки, я не верю, что понятия "предыдущий" или "следующий" доступны вам в SQL. По умолчанию RDBMS не гарантируется определенным заказом. Если вы можете сортировать по столбцу в порядке возрастания или убывания, это другое дело.
Так просто, и нет необходимости в гимнастике
Select * from Table
where id =
(Select Max(id) from Table
where id < @Id)
или, в зависимости от строки @fruitName = 'apples', или 'oranges' и т.д.
Select * from Table
where id =
(Select Max(id) from Table
where id < (Select id from Table
Where fruit = @fruitName))
Я не знаю 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;
отредактируйте два:
Джейсон Лепак сказал, что это не работает, когда есть пробелы, и это правда, и я должен лучше прочитать вопрос.
Я должен был использовать аналитику для сортировки результатов по имени фрукта
select id
, fruitname
, lead(id) over (order by fruitname) id_next
, lead(fruitname) over (order by fruitname) fruitname_next
from fruits;
Это должно сработать. Строковые "яблоки" должны быть параметрами.
Заполните этот параметр строкой, и этот запрос вернет всю запись для первого плода после этого элемента в алфавитном порядке.
В отличие от подхода LIMIT 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;
Эквивалент подхода LIMIT 1 в Oracle (только для справки) будет следующим:
select *
from
(
select *
from fruits frx
where frx.name > 'apples'
order by name
)
where rownum = 1
Если вы используете MS SQL Server 2008
(не уверен, что он доступен для предыдущих версий)...
В случае, если вы пытаетесь найти следующую запись и у вас нет уникального идентификатора для ссылки соответствующим образом, попробуйте использовать ROW_NUMBER().
См. эта ссылка
В зависимости от того, насколько разумным является ваш навык T-SQL
, вы можете создавать номера строк в соответствии с порядком сортировки. Затем вы можете найти больше, чем только предыдущую и следующую запись. Используйте его в представлениях или подзапросах, чтобы найти другую запись относительно текущего номера строки записи.
Как насчет этого:
Select * from table where id = 1 + 1