Mysql Выберите следующую и предыдущую строки не по id

У меня есть запрос, заказанный NAME, который возвращает smt следующим образом:

 ID     NAME
2121927 AAA
2123589 AAB
2121050 AAC
2463926 BBB ---> known ID
2120595 CCC
2122831 DDD
2493055 EEE
2123583 EEF

Мне нужно знать следующий идентификатор и предыдущий идентификатор (если существует) известного идентификатора && NAME Как это возможно только с 1 запросом?


person Luca    schedule 16.12.2010    source источник
comment
вы можете сделать это за 2 запроса, см. пример: stackoverflow.com/questions/1259458/   -  person Haim Evgi    schedule 16.12.2010
comment
@ Хаим, ты можешь объединить два запроса с помощью союза, не так ли?   -  person Paul Tomblin    schedule 16.12.2010


Ответы (2)


  SELECT *,
         'next'
    FROM table
   WHERE `name` > 'BBB'
ORDER BY `name`
   LIMIT 1

UNION

  SELECT *,
         'previous'
    FROM table
   WHERE `name` < 'BBB'
ORDER BY `name` DESC
   LIMIT 1

Если вы не знаете конкретное значение поля BBB name, вы можете заменить его подзапросом, например SELECT name FROM table WHERE id = 42, где 42 — известное значение ID.

person zerkms    schedule 16.12.2010
comment
лол, извините :) у меня был правильный результат со следующей строкой, предыдущая строка была первой, потому что я заказал ASC, а не DESC. - person Luca; 16.12.2010
comment
@Matej Koubík: тогда вам нужно добавить еще один столбец для согласованности, например, первичный ключ - person zerkms; 22.01.2014
comment
Сам обнаружил: SELECT * FROM table WHERE name >= 'a' AND (name > 'a' OR id > 123) ORDER BY name, id LIMIT 1 выбирает следующую запись после id = 123, name = 'a' (имя не обязательно должно быть уникальным). - person Matěj Koubík; 24.01.2014

Я сделал это следующим образом:
Это не самый быстрый способ, но он не заботится о порядке полей.
Запросить все строки из базы данных в нужном вам порядке.
Используйте php foreach, чтобы найти текущий идентификатор.
Получить индекс массива текущего идентификатора, сделать индекс +1 или индекс -1.

$current_id = 6;
$data = get_all_data_from_db();
foreach($data as $index=>$row) {
if($current_id == $row['id']) {
$next = $index+1;
$prev = $index-1;
}
$previous_row = $data[$prev];
$next_row = $data[$next];

person Frantisek    schedule 26.07.2012
comment
Шутки в сторону? А foreach ? Когда в принятом ответе есть хорошее чистое решение, использующее UNION из двух простых запросов. - person Yaroslav; 11.10.2012