Поисковая форма:) поиск по free-lance.ru Топ/история/обновления фриланса, по разным параметрам (темы, сообщения, пользователи...) Автоматическое удаление постов от ненужных юзеров в топике (php скрипт) Досье(точный ник)
 

Ник (или часть ника):
?
Какой текст ищем:
?
Раздел блогов:
За срок
дней
Тип поиска: (по вхождению: по тексту гуг выдаст посты с "гуг", "гугл", "огугл"; "полнотекстовый": по тексту "гуг" выдаст посты только с "гуг")
По вхождению строки:  Полнотекстовый: 
(поиск не 100% актуальный, есть определённая задержка при обновлении данных для поиска. )
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

©2008 edogs egods
Выразить восторг, поругаться
или предложить что-нибудь можно на форуме
Для обсуждения этого сервиса так же есть темы на фрилансе по
поиску , флудотопу ,и по удалённым сообщениям ,и по Актуальным/популярным темам , и по топу "кто кому больше наотвечал"