SQLinfo.ru - Все о MySQL Webew.ru: теория и практика веб-технологий

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 14.04.2010 18:47:31

Astream
Участник
Зарегистрирован: 14.04.2010
Сообщений: 5

Как выбрать предыдущую и следующую запись зная id?

Здравствуйте, помогите решить задачу. Есть база, из которой выводятся значения по id. как найти предыдущую и последующую запись?

Упрощенный вид запроса:

 SELECT  *  FROM   tbl  WHERE tbl .id = 10 ORDER BY  tbl. marck DESC LIMIT 1

Вот как определить предыдущую запись и следующую? Зная только id и при этом сортировка ORDER BY  меняется, соответственно предыдущее id может быть какое угодно (больше или меньше текущего)!

Заранее спасибо.

Неактивен

 

#2 14.04.2010 18:53:43

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Как выбрать предыдущую и следующую запись зная id?

Задача неоднозначна, если tbl.marck неуникальный индекс.

Неактивен

 

#3 14.04.2010 19:09:01

Astream
Участник
Зарегистрирован: 14.04.2010
Сообщений: 5

Re: Как выбрать предыдущую и следующую запись зная id?

после ORDER BY может быть не только marck но и другой столбец. Если можно было бы узнать номер по порядку строки с выбранным id? можно было бы сделать это с помощью LIMIT строка с id-1  строка с id+1. Но как?  Может есть еще решение?

Неактивен

 

#4 14.04.2010 19:16:07

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Как выбрать предыдущую и следующую запись зная id?

Вы запросом SELECT получаете все колонки строки. Потом формируете второй запрос, уже зная значения marck и других колонок, по которым идет сортировка.

Неактивен

 

#5 14.04.2010 19:19:40

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Как выбрать предыдущую и следующую запись зная id?

А мне одному кажется, что задача тривиально сводится к LIMIT 2 и ответом «предыдущей
строки нет вследствие LIMIT, вторая строка будет «следующей»?

Неактивен

 

#6 14.04.2010 19:56:10

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Как выбрать предыдущую и следующую запись зная id?

paulus написал:

А мне одному кажется, что задача тривиально сводится к LIMIT 2 и ответом «предыдущей
строки нет вследствие LIMIT, вторая строка будет «следующей»?

Автор хочет выбрать строку с другим id, а в данном запросе id фиксирован условием. Из-за этого и сложность.

Неактивен

 

#7 14.04.2010 22:55:33

Astream
Участник
Зарегистрирован: 14.04.2010
Сообщений: 5

Re: Как выбрать предыдущую и следующую запись зная id?

paulus написал:

А мне одному кажется, что задача тривиально сводится к LIMIT 2 и ответом «предыдущей
строки нет вследствие LIMIT, вторая строка будет «следующей»?

LIMIT 2 и больше не даст результата т.к tbl.id = ... а оно уникальное. С виду простая задача, а решения придумать не могу.

Неактивен

 

#8 27.07.2010 15:13:45

Scaint
Участник
Зарегистрирован: 27.07.2010
Сообщений: 1

Re: Как выбрать предыдущую и следующую запись зная id?

Вот так (для примера одним запросом):

SELECT (SELECT `id` FROM `table` WHERE `id` > 10 ORDER BY `id` LIMIT 1) AS `next`, (SELECT `id` FROM `table` WHERE `id` < 10 ORDER BY `id` DESC LIMIT 1) AS `prev`

Отредактированно Scaint (27.07.2010 15:16:53)

Неактивен

 

#9 27.07.2010 15:33:54

Astream
Участник
Зарегистрирован: 14.04.2010
Сообщений: 5

Re: Как выбрать предыдущую и следующую запись зная id?

Спасибо за ответ, но этот способ не сработает т.к. при сортировки id тоже перемешиваются и сказать, что оно больше или меньше 10 нельзя.
Похоже что без перебора всех записей эта проблема не решается - но это делать глупо.

Неактивен

 

#10 27.07.2010 15:45:08

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Как выбрать предыдущую и следующую запись зная id?

Хм, Вы до сих пор не решили задачку? RGBeast же написал решение:

1. SELECT marck FROM tablename WHERE id = 10;
2. SELECT * FROM tablename WHERE marck > :полученное_значение: ORDER BY marck LIMIT 1;
3. SELECT * FROM tablename WHERE marck < :полученное_значение: ORDER BY marck DESC LIMIT 1;

Неактивен

 

#11 27.07.2010 16:49:15

Astream
Участник
Зарегистрирован: 14.04.2010
Сообщений: 5

Re: Как выбрать предыдущую и следующую запись зная id?

Да, точно затупил sad
Все оказалось намного проще. Спасибо.

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson