ссылки next и и previous без sql-запроса

stopkran

Дилетант
На странице элемента каталога (товаров, изображений...) надо сделать ссылки на предыдущий элемент и на следующий. Т.е. только две дополнительные ссылки (не набор из 10-ти).

Не хочется получать окружающие элементы дополнительным запросом. В каждом разделе, где может "гулять" пользователь, может быть не больше 300 элементов. Может быть, просто сохранять список этих элементов в массив? но тогда где потом хранить этот массив (чтобы он был доступен на каждой странице раздела)? Делают ли так вообще, или это в корне неправильно?
 

Фанат

oncle terrible
Команда форума
как и любая денормализация, это будет создавать проблемы.
поэтому на пустом месте, без крайней нужды заниматься таким изобретательством я бы не стал.
 

Baton

Новичок
А псевдо ссылки не подойдут? Типа:

<a href='?ID=previous&curr=12345'>previous</a>
<a href='?ID=next&curr=12345'>next</a>

Расходы только в случае нажатия на ссылку.
 

Beavis

Banned
А псевдо ссылки не подойдут? Типа:

<a href='?ID=previous&curr=12345'>previous</a>
<a href='?ID=next&curr=12345'>next</a>

Расходы только в случае нажатия на ссылку.
А если понадобится выводить в ссылке название следующего товара?

P.S.
Нахрена предлагать странные решения выдуманного из ничего вопроса, если ничего не стоит сделать по-человечески?
 

stopkran

Дилетант
А если понадобится выводить в ссылке название следующего товара?

P.S.
Нахрена предлагать странные решения выдуманного из ничего вопроса, если ничего не стоит сделать по-человечески?
Почему - выдуманного? Клиент просит сделать, как увидел на другом сайте (presentomania.ru/Master_klass_po_goncharnomu_masterstvu.html - страница элемента с двумя ссылками "вперёд" и "назад").

Если понадобится название товара, можно добавить в массив и его тоже.

Я не против "сделать по-человечески", потому и спрашиваю совета. По-человечески в данном случае - это как?
 

stopkran

Дилетант
А псевдо ссылки не подойдут? Типа:

<a href='?ID=previous&curr=12345'>previous</a>
<a href='?ID=next&curr=12345'>next</a>

Расходы только в случае нажатия на ссылку.
Прикольно. Но ведь после получения такого запроса на сервере всё равно надо будет вычислять новый элемент (или брать из готового массива).
 

Baton

Новичок
На самом деле не прикольно, т.к. не известно есть ли предыдущий и следующий товар, а ссылки всегда будут висеть. Лучше конечно одним запросом получать конкретный товар и его соседей (если они есть).
 

Baton

Новичок
Расскажите нам по каком признаку вы сортируете товар, т.е. по какому признаку вы судите, что этот товар идет в списке за тем товаром и т.д. Жела-но привести структуру таблицы :)
 

stopkran

Дилетант
Расскажите нам по каком признаку вы сортируете товар, т.е. по каком признаку вы судите что этот товар идет в списке за тем и т.д. Жела-но структуру таблицы привести :)
Сортирую по полю mtime DESC (по умолчанию, но возможны и другие критерии). Структура примерно такая:
CREATE TABLE IF NOT EXISTS `tovar`(
`id` varchar(20) NOT NULL ,
`descr` text NOT NULL ,
`title` varchar(55) NOT NULL ,
`mtime` timestamp NULL DEFAULT CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
`topic` varchar(99) NULL ,
`group2` varchar(99) NOT NULL ,
`group1` varchar(99) NULL ,
`topic_index` bigint(18) NOT NULL ,
`price` float NOT NULL ,
PRIMARY KEY `id` (`id`) ENGINE=MyISAM DEFAULT CHARSET=cp1251;
 

Beavis

Banned
Почему - выдуманного?
Потому что в самый обычный вопрос "как вывести ссылки на предыдущий и следующий товар", который можно легко решить без обсуждения на форуме, ты добавил странное условие на отсутствие запроса к БД, никак не объяснив чем это мотивируется.
Поэтому я считаю это равнозначным классическому вопросу "Как есть суп вилкой?".
 

Фанат

oncle terrible
Команда форума
Почему - выдуманного?
потому что кривое велосипедное решение придумывается вперёд простого и очевидного.
Beavis говорил не о задаче со ссылками как таковой, если ты вдруг до сих пор не догадался, а о твоем велосипеде. который ты как раз благополучно высосал из пальца.
 

Baton

Новичок
При таком устройстве сортировки - timestamp, я не вижу никаких вариантов кроме трех запросов, первый это получение товара, а дальше получение соседей:

SELECT ... WHERE `mtime` <= $mtime AND `id` !=$id LIMIT 1
SELECT ... WHERE `mtime` >= $mtime AND `id` !=$id LIMIT 1

Если добавить индекс на mtime, то все будет работать достаточно быстро.
 

Beavis

Banned
При таком устройстве сортировки - timestamp, я не вижу никаких вариантов кроме трех запросов, первый это получение товара, а дальше получение соседей:

SELECT ... WHERE `mtime` <= $mtime AND `id` !=$id LIMIT 1
SELECT ... WHERE `mtime` >= $mtime AND `id` !=$id LIMIT 1
только саму сортировку надо не забыть
 

Baton

Новичок
Beavis

Ах да, извините, поправил:

SELECT ... WHERE `mtime` <= $mtime AND `id` !=$id ORDER BY `mtime` DESC LIMIT 1
SELECT ... WHERE `mtime` >= $mtime AND `id` !=$id ORDER BY `mtime` LIMIT 1
 

Baton

Новичок
И кстати timestamp очень плохое решение для сортировки. Представьте что Вы одновременно загнали в таблицу ваши триста товаров и у всех получится одинаковое поле timestamp.
 
Сверху