Выборка дынных для реализации навигации "<- перыдущее следующее ->"

NiGal

Новичок
Выборка дынных для реализации навигации "<- перыдущее следующее ->"

Помогите найти функцию (запрос?)
Дело в том, на что на при создании доски объявлений была допущена парочка проблем при реализации сортировки объявлений пользователей.
.1 небыло никаких уникальных индентификаторов объявления кроме id
.2 значение поля "дата" была только YYYY-mm-dd

Теперь, после некоторой переделки структуры поменялся порядок и при запросе
".....ORDER BY date DESC, id DESC..." результат примерно таковой

...
122; 2008-01-12
501; 2008-01-10
51; 2008-01-8
...

Вопрос - как зная id объявления "501" узнать, что следующий за ним будет "122", а не "502", и предыдущий "51", а не "500".
Если кому что непонятно в постановке задачи - с удовольствием распишу подробнее...

Спасибо всем за помощь.

-~{}~ 19.01.08 21:22:

Похоже народу чего сказать...
Либо я мало данных дал для понимания..
..либо никто не знает как решить проблему...
 

NiGal

Новичок
"Санитар PHPClubа" - это конечно хорошо, но тут проблема не в Вашем решении, точнее Ваше решение - не для моей проблемы.
Мой посетитель видит перед собой 1! объявление, на которое он кликнул, а ниже текста должно быть 2 ссылки
<- перыдущее следующее ->
Ранее это было просто $id-- $id++

...
но порядок теперь изменен и такая лажа не прокатит...

далее все так как выше описал....
есть еще предложения?!
пожалуйста!!!
 

fixxxer

К.О.
Партнер клуба
2 запроса (или один с union select)
для исправления неоднозначности с date - определить правило сортировки по date+id и использовать его либо всегда, либо 1 раз для конвертации date -> date+time
 

dark-demon

d(^-^)b
выбрать всё, что старше, отсортировать по порядку и выбрать первую запись
выбрать всё, что младше, отсортировать в обратном порядке и выбрать первую запись.
 

phprus

Moderator
Команда форума
NiGal
"Санитар PHPClubа" - это конечно хорошо, но тут проблема не в Вашем решении, точнее Ваше решение - не для моей проблемы.
Мой посетитель видит перед собой 1! объявление, на которое он кликнул, а ниже текста должно быть 2 ссылки
<- перыдущее следующее ->
Ранее это было просто $id-- $id++
Из вашего объяснения не совсем понятно что вам было нужно: постраничный вывод с одним объявлением на странице или ссылки на более старое/новое объявления. Если бы вы чуть точнее объяснили проблему, то я бы не стал писать ссылку на PHP FAQ.
 

NiGal

Новичок
Автор оригинала: phprus
NiGal

Из вашего объяснения не совсем понятно что вам было нужно: постраничный вывод с одним объявлением на странице или ссылки на более старое/новое объявления. Если бы вы чуть точнее объяснили проблему, то я бы не стал писать ссылку на PHP FAQ.
@@ Вопрос - как зная id объявления "501" узнать, что следующий за ним будет "122", а не "502", и предыдущий "51", а не "500".
Если кому что непонятно в постановке задачи - с удовольствием распишу подробнее... ""
- из этого непонятно что я имел ввиду единичное объявление в не вывод постранично какого то количества.

Спасибо Вам что отозвались...

fixxxer, сортировка как я уже говрил как раз по date DESC, id DESC... можешь ли по-поднобнее описать сам процес??

dark-demon, 3ри запроса вместо 1го - пользователи повесятся... =)

Помогите, пожалуйста.
 

TutanXamoN

Новичок
NiGal
Вы можете средствами мускла получить ИД объявления с первой датой МЕНЬШЕ_РАВНО дате текущего ИД и ИД объявления с первой датой БОЛЬШЕ_РАВНО дате текущего ИД?

ЗЫ в принципе ето уже псевдо-запрос :) Вам осталось лишь правильно поставить ASC||DESC

-~{}~ 20.01.08 00:37:

3ри запроса вместо 1го - пользователи повесятся... =)
Не говорю конкретно о ком либо но встречались запросы и архитектуры в которых один запрос дающий n строк заменялся количеством=n*3 и на последний вариант тратилось в lg n времени меньше)
 

Pigmeich

Новичок
dark-demon, 3ри запроса вместо 1го - пользователи повесятся... =)
3 запроса в одном, гораздо лучше 3 отдельных. Даже, может быть лучше 2 отдельных.

Если индексы поставленны, то выборка может быть очень быстрой.
 

NiGal

Новичок
Автор оригинала: TutanXamoN
NiGal
Вы можете средствами мускла получить ИД объявления с первой датой МЕНЬШЕ_РАВНО дате текущего ИД и ИД объявления с первой датой БОЛЬШЕ_РАВНО дате текущего ИД?

-~{}~ 20.01.08 00:37:
Я бы с радостью, да дело в том, что дата, как я говорил ранее, это всего лишь YYYY-mm-dd , т.е. date, а не date+time.
А следовательно за один день добавляется до 300т новых объявлений с одной датой.

Понимаю, что значительно проще просто изменить формат времени, но может Мы и так решим эту проблему?!
 

Mols

Новичок
Автор оригинала: NiGal
Понимаю, что значительно проще просто изменить формат времени, но может Мы и так решим эту проблему?!
Если понимаете, и это действительно решит Ваши вопросы - в чём проблема ?
Зная только ИД просматриваемого объявления лично я не вижу как одним запросом получить то, что вам надо.
Будет или 2 запроса или вложенный запрос.
Да и вообще оставлять решение с такими сортировками при быстро растущей таблице... ну в общем я бы так не делал. Менять структуру и логику прийдется не сегодня - так завтра. Так что explain в руки и вперёд )))
 

NiGal

Новичок
Автор оригинала: TutanXamoN
Вы можете средствами мускла получить ИД объявления с первой датой МЕНЬШЕ_РАВНО дате текущего ИД и ИД объявления с первой датой БОЛЬШЕ_РАВНО дате текущего ИД?

ЗЫ в принципе ето уже псевдо-запрос :) Вам осталось лишь правильно поставить ASC||DESC
Прошу извинить мою бездарную личность, но что-то никак не выходит...

SELECT id, title FROM ".MSGTABLE." WHERE date>='$date' ORDER BY date_on DESC, id

всеро как все сочетания попробывал - не выходит...
 

dark-demon

d(^-^)b
( date<'$date' ) or (( date = '$date' )and( id>$id ))

limit 1 offset 1

ps: угловые скобки расставь по вкусу - мне лень думать :)
 

NiGal

Новичок
Автор оригинала: dark-demon
( date<'$date' ) or (( date = '$date' )and( id>$id ))

limit 1 offset 1
дело в том, что id может быть и меньше... его нельзя использовать как ограничение.
Вопрос...а нет ли функции, например что то типа SELECT NEXT(id) FROM $table WHERE POST(id)=$id ORDER BY... или же что то в этом роде?! =)
 

NiGal

Новичок
Мдя...
Дата может быть меньше, вместе с тем, когда и id будет меньше...
И наоборот...
 

NiGal

Новичок
Я может что то не догоняю... но
в вашем совете точное ограничение, что id должет быть строго больше данного, так?? или нет?!
 
Сверху