Эта тема на forum.dklab.ru


Mihail: Как сделать рейтинг товаров?
Кто знает как правильно сделать рейтинг товаров на сайте?
Есть база данных с товарами, у каждого из которого есть поле "рейтинг", в котором содержится число покупок этого товара.
А как должна собираться и выводится статистика? Скрипт при обращении к нему должен каждый раз просматривать базу с товарами, выбирая самые популярные? Или нужно создать отдельную таблицу в базе, в которую через определённый промежуток времени должны заноситься самые популярные товары?
Как сделать правильно? Мне важна не практическая, а теоретическая сторона вопроса. Подскажите, кто знает, или посоветуйте статью по этой теме.
Заранее спасибо.
WingedFox:
Я предпочитаю собирать статистику по покупателям - так сразу можно получить список всего, что покупал человек, посчитать ему скидку и т.д.
По результатам обработки этой статистики (раз в сутки или даже реже) имеет смысл обновлять таблицу рейтинга, и туда же ссыпать информацию по товарам, которые покупают вместе с этим (может быть Вы видели в магазинах "наши покупатели этого товара предпочитают еще и эти...").

Для ускорения работы лучше сделать именно редко обновляемут таблицу.
Иначе - мускуль может захлебнуться при большом количестве запросов. А если на сервере стоит что-то более правильное, то можно подумать и о других возможностях (VIEWS и т.п.)

На phpclasses.org я видел несколько реализаций "магазина" - можете почитать код.
Евгений Бондарев:
Mihail:
Скорее всего у вас есть таблица, в которую заносится информация о заказах типа ID товара, количество, ID заказа и т.п.
Вот отсюда вы и можете сделать вывод о том, какой из товаров покупается чаще всего ;-)
Mihail:
Может быть я не точно задал вопрос. У меня таблица с товарами, у каждого есть поле рейтинг, которое увеличивается при покупке этого товара. А на главной странице будет рейтинг: "10 самых продаваемых товаров". А как вывести результаты рейтинга, чтоб он был актуален на данный момент? Просто обновлять отдельную таблицу с наименованием 10 самых покупаемых товаров в определённый момент (например, когда пользователь купит товар)? И уже из неё брать результат на главную страницу. А так же через каждый период времени обнулять поле рейтинг у каждого товара?
DmitriyPopov:
При такой задаче нету никакого смысла делать отдельную таблицу
WingedFox:
А это уже как хочется... мало ли критериев актуальности?
У меня, например, существует отдельная таблица с подборкой правил отпеределения "горячей десятки".
Евгений Бондарев:
Mihail:
Хм... Вы SQL видели? У SELECTа есть такие параметры, как ORDER BY и LIMIT. Копайте в этом направлении и будет вам счастье!
Mihail:
Это всё я понял. Но для того чтобы рейтинг был актуальным на данный момент, его периодически надо обнулять. Так? А как сделать, чтобы php скрипт периодически запускался и обнулял результаты рейтинга?
WingedFox:
Зачем, если не секрет?
Не лучше ли собирать статистику в таблицы для последующего анализа?
Например - новая таблица на месяц.
Или просто поле в таблице, отмечающее дату. И выбирать по условиям.

Хотя, если хочется что-то удалять по расписанию - man cron
DmitriyPopov:
Например - новая таблица на месяц
Ой млин... Учите мат. часть. Я тоже когда-то такие вопросы задавал.

Mihail:
Если нужна актуальность только на данный момент - то обнулять через cron.
Если нужна в будующем и статистика за определенные моменты, тогда да - надо создавать новую таблицу. И перед обнулением текущего рейтинга переносить его туда.
meow:
Помойму лучше так, если я все правильно понял.


SELECT tovar,COUNT(*) FROM prodazhi WHERE time>".time()-3600." GROUP BY tovar ORDER BY 'COUNT(*)' DESC LIMIT 10

DmitriyPopov:
Вам двойка с плюсом. И из-за SQL-функций в кавычках, и из-за count(*)
meow:
Насчет самой функции по сути - я понял, она не правильная и в данном случае с товаром не поможет.

А по поводу кавычек и count(*) не понял совсем. Почему нельзя?
DmitriyPopov:
А что нам говорит эксперимент? (C)
meow:
Эксперимент говорит, что именно такая функция с COUNT(*) у меня работает. Да и с кавычками тоже пока проблем не имел.
Евгений Бондарев:
meow:
А что это вы за бред написали?
meow:
Где бред, объясните?
DmitriyPopov:
В запросе.
Юрий Насретдинов:

SELECT unexisting_element from INSERT_ID() WHERE IN (SELECT * FROM php_table)


И все это скормить MySQL.
Mihail:
А по-подробнее про man cron и его использование можно?
Юрий Насретдинов:
Mihail:
Наберите в SSH "man cron" и все увидите, если знаете английский язык.
Дмитрий Котеров:
Имеется в виду, что лучше бы записать так:

$sql =
"SELECT tovar, COUNT(*) as cnt FROM prodazhi WHERE time>".(time()-3600).
" GROUP BY tovar ORDER BY cnt DESC LIMIT 10";


Ваш вариант (с COUNT(*) в кавычках), кстати, не факт, что не работает, ибо второй столбец в выборке будет действительно называться "COUNT(*)" и в таком виде попадет в результат mysql_fetch_assoc(). Может только кавычки должны быть обратными. Лучше все же не рисковать.

SELECT unexisting_element from INSERT_ID() WHERE IN (SELECT * FROM php_table)
Указывайте, пожмлуйста, версию MySQL, в которой это чудо работает.

Mihail:
Что касается вопроса — старайтесь делать динамические запросы, а не хранить статистику где-то еще. В крайнем случае, прикрутите кэширование, если нужна будет особенная скорость.
Дмитрий Котеров:
А по-подробнее про man cron и его использование можно?
Лучше не связывайтесь. Сделайте просто в скрипте, чтобы он периодически нужную таблицу чистил и сохранял время последней чистки где-нибудь. Тогда, если у Вас будет ежедневно хотя бы 1 посетитель, таблица будет чиститься.
Юрий Насретдинов:
Дмитрий Котеров:
А можно даже на сайт вставить. Хотя когда нужно каждые 5 минут что-то проверять, то лучше все же подойдет cron...
Дмитрий Котеров:
Cron не такой универсальный метод. Где-то он есть, где-то нет. Отлаживать скрипты для него тяжело. Наконец, после копирования сайт придется еще настраивать (добавлять в cron запись), что можно забыть сделать.
Mihail:
Всем спасибо за ответы. Всё. Вопросов больше нету.

Эта тема на forum.dklab.ru