Запрос previous/next

Solid

Drosera anglica
Запрос previous/next

Столкнулся с проблемой, которую, подозреваю, можно решить более удобным и быстрым способом, через один запрос.
Суть задания, получить предыдущую и следующую записи, т.е. у нас есть таблица names, где есть такие поля:
id - уникальное, автоинкрементальное целочисленное.
name - какое-то имя, вида char 32
Запрос осуществляется через PHP скрипт. Как делаю сейчас:
1) получаю главную запись через id, т.е.:
SELECT * FROM names WHERE id='$id'
2) предыдущую запись через:
SELECT * FROM names WHERE id<'$id' ORDER BY id DESC LIMIT 1
3) и соотвественно следующую таким же образом:
SELECT * FROM names WHERE id>'$id' ORDER BY id ASC LIMIT 1
Надеюсь суть понятная. Надеюсь на ваши комментарии.
 

Фанат

oncle terrible
Команда форума
Ну, можно двумя. Если подумать.
но с чего ты взял, что это будет сильно быстрее?

-~{}~ 23.02.06 16:58:

Столкнулся с проблемой
я пока никакой проблемы не увидел.
Это единственная проблема, которая перед тобой стоит?
Остальные решил?
 

Solid

Drosera anglica
Автор оригинала: Фанат
Ну, можно двумя. Если подумать.
но с чего ты взял, что это будет сильно быстрее?
Но ведь быстрее будет.
Да и самому интересно стало, вдруг есть и другие методы, а знания, как говорится, никогда не помешают.

-~{}~ 23.02.06 17:01:

Да, конечно, это несовсем проблемма. Единственное, хотелось бы способ поизящнее, одним запросом. Или даже просто другой метод.
 

Фанат

oncle terrible
Команда форума
нету дргого метода.

странно, что у тебя стртировка идёт не по имени, а по айди
 

ForJest

- свежая кровь
Представь себе что это постраничный список, и на каждой странице всего по одному элементу. Тогда получаем три запроса:

Для текущего
SELECT * FROM my_table LIMIT $num, 1;
Для предыдущего
SELECT * FROM my_table LIMIT $num-1, 1;
Для следующего
SELECT * FROM my_table LIMIT $num+1, 1;

Удобства этого метода в том, что можно задать произвольную сортировку или критерий отбора.

-~{}~ 23.02.06 16:06:

Распространённая практическая проблема :). Думаю все кто зарабатывает на жизнь веб-программированием хоть раз её в жизни решали :).
 

Фанат

oncle terrible
Команда форума
если учесть, что при постраничном прихоидтся всегда делать ещё один запрос - на количество,то овчинка,имхо, выделенки не стоит

вообще-то, можно обойтись вообще без запросов предыдущего/следующего.
а передавать айди текущего и направление.

юзабилити, правда, пострадает.
 

Solid

Drosera anglica
Да, видимо, мой вариант самый лучший, хотя, мне кажеться, что-то придумать можно.. но я не буду ломать голову, только если будет свободное время.
Всем спасибо.
 

ForJest

- свежая кровь
если учесть, что при постраничном прихоидтся всегда делать ещё один запрос - на количество,то овчинка,имхо, выделенки не стоит
Если поразмыслить (хотя бы секунд пять), то можно понять что
SELECT * FROM my_table LIMIT $num+1, 1;
вернёт num_rows = 0, в том случае, если запись $num была последняя, и следовательно count здесь и нафиг не нужен.

Задача решается по сути в один запрос, если кто не понял
-----------------------------------------------------
<a href="get.php?num=$num-1">Prev</a>

Здесь мы извлекаем данные с помощью запроса
SELECT * FROM my_table LIMIT $_GET['num'], 1;


<a href="get.php?num=$num+1">Next</a>
-----------------------------------------------------

Для страниц next и prev это будет снова $_GET['num']. Когда его получит страница.
 

Solid

Drosera anglica
Автор оригинала: ForJest
Если поразмыслить (хотя бы секунд пять), то можно понять что
SELECT * FROM my_table LIMIT $num+1, 1;
вернёт num_rows = 0, в том случае, если запись $num была последняя, и следовательно count здесь и нафиг не нужен.

Задача решается по сути в один запрос, если кто не понял
<a href="get.php?num=$num-1">Prev</a>
Здесь мы извлекаем данные с помощью запроса
SELECT * FROM my_table LIMIT $num, 1;
<a href="get.php?num=$num+1">Next</a>
Для страниц next и prev это будет снова num. Когда его передадут.
Думаете, если бы всё было так просто, я бы просил у вас помощи?
Мне требуется получить именно id & name, а не -1.

-~{}~ 23.02.06 17:25:

Откуда вы знаете, что я получаю $num или $id из $_GET, аргументов адресной строки?
 

ForJest

- свежая кровь
Ну конечно же всё так просто.
Один раз получаем num с помощью id и потом им пользуемся.
Как получить сколько элементов ДО элемента с id = $id, думаю можно додуматься.
 

Фанат

oncle terrible
Команда форума
а их больше не откуда получить

-~{}~ 23.02.06 17:28:

Задача решается по сути в один запрос
если кто не понял,я это решение написал раньше =)
и лучше.
where работает лучше, чем limit
 

ForJest

- свежая кровь
Solid
Мне в целом всё равно. Я просто буду давать ссылку на этот пост, потому что вопрос возникает время от времени у множества людей.

-~{}~ 23.02.06 16:29:

Фанат
Чёт я не вижу ни одного WHERE в твоих сообщениях в этом треде.
 
Сверху