Подтвердить что ты не робот

Как найти следующую запись после указанного в SQL?

Я хотел бы использовать один 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, а на алфавитном порядке имени фруктов. Следовательно, мой пример выше неверен и должен возвращать апельсины, поскольку он идет в алфавитном порядке после яблок. Есть ли способ выполнить сравнение строк, а не идентификаторов?

4b9b3361

Ответ 1

После редактирования вопроса и упрощения ниже мы можем изменить его на

SELECT id FROM table WHERE fruit > 'apples' ORDER BY fruit LIMIT 1

Ответ 2

SELECT * FROM table WHERE id > 1 ORDER BY id LIMIT 1

Еще проще

UPDATE:

SELECT * FROM table  WHERE fruit > 'apples' ORDER BY fruit LIMIT 1

Ответ 3

Я не знаком с синтаксисом MySQL, но с SQL Server вы можете что-то сделать с помощью "top", например:

SELECT TOP 1 * FROM table WHERE id > 1 ORDER BY id;

Это предполагает, что поле id уникально. Если он не уникален (например, внешний ключ), вы можете сделать что-то подобное, а затем присоединиться к той же таблице.

Так как я не использую MySQL, я не уверен в синтаксисе, но представляю, что это похоже.

Ответ 4

Если вы не укажете порядок сортировки, я не верю, что понятия "предыдущий" или "следующий" доступны вам в SQL. По умолчанию RDBMS не гарантируется определенным заказом. Если вы можете сортировать по столбцу в порядке возрастания или убывания, это другое дело.

Ответ 5

Так просто, и нет необходимости в гимнастике

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))

Ответ 6

Я не знаю 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;

Ответ 7

Это должно сработать. Строковые "яблоки" должны быть параметрами.

Заполните этот параметр строкой, и этот запрос вернет всю запись для первого плода после этого элемента в алфавитном порядке.

В отличие от подхода 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

Ответ 8

Если вы используете MS SQL Server 2008 (не уверен, что он доступен для предыдущих версий)...

В случае, если вы пытаетесь найти следующую запись и у вас нет уникального идентификатора для ссылки соответствующим образом, попробуйте использовать ROW_NUMBER(). См. эта ссылка

В зависимости от того, насколько разумным является ваш навык T-SQL, вы можете создавать номера строк в соответствии с порядком сортировки. Затем вы можете найти больше, чем только предыдущую и следующую запись. Используйте его в представлениях или подзапросах, чтобы найти другую запись относительно текущего номера строки записи.

Ответ 9

Как насчет этого:

Select * from table where id = 1 + 1