Как найти следующую запись после указанной в SQL? - PullRequest
18 голосов
/ 31 декабря 2008

Я хотел бы использовать один запрос SQL (в MySQL), чтобы найти запись, которая идет после той, которую я указываю.

Т.е., если в таблице есть:

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, но это медленнее, чем хотелось бы. Есть ли более быстрый способ сделать это?

Я был бы рад тому, что вернуло две строки - то есть одну с указанным значением и следующую строку.

РЕДАКТИРОВАТЬ: Извините, мой вопрос был плохо сформулирован. К сожалению, мое определение слова «следующий» основано не на идентификаторе, а на алфавитном порядке названия фруктов. Следовательно, мой приведенный выше пример неверен и должен возвращать апельсины, как это происходит в алфавитном порядке после яблок. Есть ли способ сделать сравнение строк вместо идентификаторов?

Ответы [ 10 ]

31 голосов
/ 31 декабря 2008

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

SELECT id FROM table WHERE fruit > 'apples' ORDER BY fruit LIMIT 1
7 голосов
/ 31 декабря 2008
SELECT * FROM table WHERE id > 1 ORDER BY id LIMIT 1

Еще проще

UPDATE:

SELECT * FROM table  WHERE fruit > 'apples' ORDER BY fruit LIMIT 1
1 голос
/ 31 декабря 2008

Так просто, и гимнастика не требуется

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))
1 голос
/ 31 декабря 2008

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

1 голос
/ 31 декабря 2008

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

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

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

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

0 голосов
/ 22 ноября 2018
SELECT cur.id as id, nxt.id as nextId, prev.id as prevId FROM video as cur
  LEFT JOIN video as nxt ON nxt.id > cur.id
  LEFT JOIN video as prev ON prev.id < cur.id
WHERE cur.id = 12
ORDER BY prev.id DESC, nxt.id ASC
LIMIT 1

Если вам нужен элемент с предыдущим и следующим элементом, этот запрос позволяет вам сделать это.

Это также позволяет Вам иметь пробелы в данных!

0 голосов
/ 14 сентября 2012

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

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

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

0 голосов
/ 31 декабря 2008

Это должно работать. Строка 'apple' должна быть параметром.

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

В отличие от подхода 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
0 голосов
/ 31 декабря 2008

Я не знаю 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;
0 голосов
/ 31 декабря 2008

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

Select * from table where id = 1 + 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...