|
0 Всего найдено: 15
resurection
Сообщение
19/03/2009 11:24
Копия темы
Интересная практическая задачка-головоломка PHP+SQL . Есть интернет магазин в котором товары разбиты на категории. URL='catalog/52' юзер попадает в группу с номером 52 и просматривает товары в ней. Отдельной страницы для каждого товара нет. Но в каждой группе есть постраничная навигация URL='catalog/52?page=2' попадает на вторую страницу. Проблема заключается в поиске по каталогу. Когда юзер в результатах поиска кликает по какой-то позиции он попадает на страницу "catalog/52?goTo=199" (это аналог для "catalog/52#good199" но используется навороченый JS-скролл к позиции 199). Но на этой странице товара с таким ID может и не оказаться т.к. он находится на второй странице. Проблема усугубляется тем, что товары сортируются по названию производителя и имени (ORDER BY `developer` ASC, `name` ASC). Из-за такого порядка сортировки я не могу определить на какой странице внутри группы находится мой товар! И не могу послать юзера на правильную страницу. Как сделано на других сайтах: 1. Есть отдельная страница для каждого товара. Соответственно пользователь попадает на неё. Но у меня такой страницы нет и делать её нельзя. 2. На форумах когда вы кликаете "перейти к не прочитанному сообщению" (URL="/showthread.php?goto=199&topic=52") программа ищет кол-во записей стоящих до 199-ой: SELECT COUNT(*) FROM `tbl` WHERE `cat`=52 AND `id` < 199; Т.е. фактически, получает порядковый номер записи и далее зная кол-во на одной странице вычисляет номер страницы. Но мне такой вариант не подходит потому, что товары сортируются по названиям производителей и по собственным названиям (ORDER BY `developer` ASC, `name` ASC). Из-за этого я не могу написать фильтр WHERE `cat`=52 AND `developer` < 'тиккурила' AND `name` < 'Краска Беталюкс красная' // не правильный фильтр. Есть ещё вариант: выцепить список правильно отсортированных всех наименований в категории и далее циклом пройтись по всей пачке в поисках интересующей записи таким образом получить порядковый номер записи. Но этот способ какой-то высоко-систему-нагружалистый-и-выполняющий-бесчисленное-колво-лишних-действий. Есть какие-нибудь идеи? P.S.> resurection.ru/alget/cata.. правильно работает т.к. товар на первой странице. resurection.ru/alget/cata.. а этот нет, т.к. товар находится на третьей странице.
big-rich
Сообщение
19/03/2009 11:37
Копия темы
. Немного повысит нагрузку НО сделать можно вот как. Таким же методом каким делается постраничная навигация посчитайте на какой странице будет находится нужный товар и добавьте переменную с этой страницей в ссылку.
resurection
Сообщение
19/03/2009 11:45
Копия темы
. Проблема в том, что бы вычислить позицию товара внутри группы. Есть вариант выцепить список правильно отсортированных всех наименований в категории и далее циклом пройтись по всей пачке в поисках интересующей записи – таким образом получить порядковый номер записи. Но этот способ какой-то высоко-систему-нагружалистый-и-выполняющий-бесчисленное-колво-лишних-действий. Это конечно будет работать. Но мне кажется, должно быть более "правильное" решение.
fasterx
Сообщение
19/03/2009 11:51
Копия темы
. я правильно понимаю: внутри группы товар отсортирован по производителям? а что мешает использовать эту сортировку в определении страницы?
resurection
Сообщение
19/03/2009 11:54
Копия темы
. Товар отсортирован по производителям + названию: SELECT * FROM `tbl` WHERE `cat`=52 ORDER BY `developer` ASC, `name` ASC; В этом и есть вопрос: как определить страницу при такой сортировке?
fasterx
Сообщение
19/03/2009 12:05
Копия темы
. как вариант сделать определение страницы в момент тыканья на конкретный товар разборщик определит страницу для конкретного товара и сделает редирект на нужную типа if($_GET['goTo']) { считаем количество записей определяем страницу редиректим }
resurection
Сообщение
19/03/2009 12:19
Копия темы
. Ещё раз повторю вопрос: Как определить страницу? Или: Как посчитать кол-во записей стоящих ДО 199 ??? Я уже писал: "Из-за такого порядка сортировки я не могу определить на какой странице внутри группы находится мой товар!". Редиректы я делать умею (слава богу).
fasterx
Сообщение
19/03/2009 13:05
Копия темы
. так? $current_position=0; $sql = mysql_query("SELECT id FROM `tbl` WHERE `cat`=52 ORDER BY `developer` ASC, `name` ASC;"); while($data=mysql_fetch_array($sql,MYSQL_ASSOC)) {$current_position++; if($data['id']==199){break;} } $page=ceil($current_position/$per_page);
Vogogo
Сообщение
19/03/2009 13:08
Копия темы
. Используйте подзапросы SET @n:=0; SELECT number from (select id, @n=@n+1 as number from table ORDER BY `developer` ASC, `name` ASC) t2 where t2.id=....
resurection
Сообщение
19/03/2009 13:37
Копия темы
. Вы вопрос прочитали? Цитирую: "Есть ещё вариант: выцепить список правильно отсортированных всех наименований в категории и далее циклом пройтись по всей пачке в поисках интересующей записи – таким образом получить порядковый номер записи. Но этот способ какой-то высоко-систему-нагружалистый-и-выполняющий-бесчисленное-колво-лишних-действий. " Мне кажется, должно быть более "правильное" решение.
fasterx
Сообщение
19/03/2009 13:41
Копия темы
. я не предлагал вам определять страницу в результатах поиска. а предлагал определять страницу в обработчике при переходе на конкретный урл с результатов поиска. не вижу в той конструкции что я привел какой то особой нагрузки. используйте совет Vladimir Klimenko [Vogogo]
resurection
Сообщение
19/03/2009 14:18
Копия темы
. Не плохое решение, но фактически тот же цикл на стороне МуСКЛа. При этом разгружается оперативная память по сравнению с циклом на стороне PHP. Решение полученное из Космоса от вселенного разума: WHERE `cat_id` = 52 AND ( `developer` < 'Тиккурила' OR ( `developer` = 'Тиккурила' AND `name` < 'Краска в/д Тиккурила Евро 7 матовая (А) 18л' ) )
Vogogo
Сообщение
19/03/2009 14:44
Копия темы
. Надеюсь, вселенский разум не обидется если я чуть-чуть подправлю :) WHERE `cat_id` = 52 AND ( `developer` <= 'Тиккурила' OR `name` <= 'Краска в/д Тиккурила Евро 7 матовая (А) 18л' )
resurection
Сообщение
19/03/2009 14:56
Копия темы
. Так работать не будет потому что в результат выборки попадут лишние записи, например: запись с параметрами: developer='ЯЯЯ самый последний в списке производителей', name='Краска альба' ...потому что выполнится второе условие: 'Краска альба' < 'Краска в/д Тиккурила'. Но на самом деле эта запись стоит в самом конце после интересующей нас т.к. её производитель... Напоминаю: ORDER BY `developer`ASC // стоит первым `name` ASC // По этому полю сортируется после сортировки по производителям. P.S.> Всемирный разум рад рассмотреть Ваши предложения и ответить на Ваши вопросы :)
Vogogo
Сообщение
19/03/2009 15:00
Копия темы
0
. А точно :) Не удалось отредактировать, что тут добавишь "всемирный разум" :) |
Выразить восторг, поругаться или предложить что-нибудь можно на форуме |
Для обсуждения этого сервиса так же есть темы на фрилансе по поиску , флудотопу ,и по удалённым сообщениям ,и по Актуальным/популярным темам , и по топу "кто кому больше наотвечал" |