Подсчет рейтинга товаров

Mishanja

Новичок
Подсчет рейтинга товаров

Добрый день уважаемые программисты!

Есть вопрос, а точнее задачка.

- Есть таблица MySQL с товарами в которой для нас имеют значение следующие поля:
- prod_id (ID товара);
- views (количество просмотров информации о товаре);
- orders (количество покупок товара);
- rating (рейтинг товара (от 1 до 5);

- На отдельной странице я вывожу список всех товаров, при этом могу их сортировать по рейтингу (select *** from *** order by rating DESC/ACS). С этой странички можно попасть на страничку с детальным описанием товара, в этом случае в поле views соответственно ID товара к существующему значению прибавляется единичка. Можно купить товар, и тогда в поле buys добавится единичка.

- Задача состоит в том, чтобы определить рейтинг товара от 1 до 5 учитывая только количество просмотров и количество покупок.

Логика определения рейтинга такова:

Рейтинг = количество просмотров + количество покупок * 5

При помощи нехитрого запроса из базы, цикла while и mysql_fetch_row мне удалось создать массив, в котором ключами явлются ID товаров а значениями рейтинг по формуле.
Т.е. примерно так

1 => 15
2 => 98
3 => 87
4 => 55
5 => 1
6 => 18
и т.д. по количеству товаров в таблице

Теперь самое сложное (для меня):
Как определить рейтинг от 1 до 5 для каждого товара.

Подумал, может можно сделать следующим образом:

1. Сортирую массив с сохранением ключей по убыванию: arsort
2. Далее считаю сколько всего элементов в массиве: count
3. Считаю сколько элементов в массиве может быть с определенным рейтингом (получаю $n). Т.е. если рейтингов всего 5, то я делю количество элементов массива на 5 и округляю (ceil) результат в большую сторону.
4. И вот далее я застопорился. Т.е. мне надо первым n элементам присвоить рейтинг пять, следующим n элементам присвоить четыре, следующим 3, следующим 2, а остальным 1.
5. Уже после этого разнести результаты по базе, поставив соответствующему ID товара соответствующий рейтинг.

Вот не знаю как пункт 4 реализовать. Толи городить циклы с использованием next то ли еще как-то.

Соответственно вопросы:
- Стоит ли городить такую кашу или есть более простой способ.
- Если способа нет, то как лучше реализовать пункт 4.

Заранее благодарю. Извините если очень много текста получилось.
 

Raul

Новичок
А алгоритм подсчета д.б. именно такой?

Ведь, например если:
1 => 15
2 => 98
3 => 87
4 => 55
5 => 1
6 => 15
Товары со значением 15 попадут в разные рейтинговые группы
Не правильнее исходить из MAX значения (98)
И тогда уже все просто...
 

Mishanja

Новичок
Фанат, можно в запросе посчитать конечную цифру конечно само собой.

Но как мне превратить ее в 5 или 4 или 3 или 2 или 1

-~{}~ 16.05.06 13:51:

Raul

Не совсем понял что вы имеете в виду.

Просто я выбираю сначала, потом сортирую, потом хотел разбить на группы, а как не знаю
 

Raul

Новичок
Автор оригинала: Mishanja
Не совсем понял что вы имеете в виду.
По твоему алгоритму определения рейтинга
Рейтинг 5 будут иметь элементы 2 => 98, 3 => 87
4: элементы 4 => 55, 6 => 18
3: элементы 1 => 15, 5 => 1
2 и 1 вообще не будет

если же 98 разделить на 5 и округлить до целого (20)
рейтинг 5: 2 => 98, 3 => 87 (значения от 81 до100)
4: нет (61 -> 80)
3: 4 => 55 (41 -> 60)
2: нет (21 -> 40)
1: 6 => 18, 1 => 15, 5 => 1(0 ->20)
 

Mishanja

Новичок
Рауль, нет, ты по ходу не понял алгоритма

У меня будет массив где ключ - ID товара, а значение - рейтинг товара
1->98
2->90
3->9
4->34
5->76
6->1
и т.д.

Первым делом я его сортирую по убыванию значений, сохраняя ключи (ключ - это айди товара). Товаров может быть 1000 и более.

В итоге получаю тот же массив но уже:
1->98
2->90
5->76
4->34
3->9
6->1
и т.д.

Потом я вычисляю количество элементов в массиве.

Допустим - элементов 10, а рейтинг от 1 до 5

Потом делю количество элементов на количество возможных рейтингов. 10/5=2

Получаю число, которое мне нужно, чтобы по сколько элементов разбивать массив.

Ну а далее
переназначаю значения массиву и должно получиться что-то вроде этого:
1->5
2->5
5->4
4->4
3->3
6->3
и т.д. до конца массива.
Получится что он все числа выстроит по рангу и равному количеству элементов присвоит номер рейтинга в зависимости от значения.

Потом этот рейтинг заношу в базу.

-~{}~ 16.05.06 14:28:

Только вот не знаю как это красиво на PHP написать :)
 

Raul

Новичок
Автор оригинала: Mishanja
Рауль, нет, ты по ходу не понял алгоритма

В итоге получаю тот же массив но уже:
1->98
2->90
5->76
4->34
3->9
6->1
и т.д.
Я понял :)
Еще раз...
Если у тебя будет:
1->98
2->90
5->76
4->34
3->34
^^^^^
6->1
и т.д.

т.е. товары с одинаковым рейтинговым весом попадают в разные рейтинговые группы
Конечно, с увеличением count погрешность будет уменьшаться.
 

Mishanja

Новичок
Ну да, есть такое дело, но это уже не такая проблема.

Только как все-таки с п.4 быть. Как мне разделить этот массив.
 

Raul

Новичок
Автор оригинала: Mishanja
Ну да, есть такое дело, но это уже не такая проблема.

Только как все-таки с п.4 быть. Как мне разделить этот массив.
Если именно так, то я бы копал в направлении,
указанном Фанатом.
Используя ORDER BY и LIMIT...
 

Raul

Новичок
Автор оригинала: Mishanja
ORDER BY по какому полю делать?
По тому, которое ты сказал:
Автор оригинала: Mishanja
Рейтинг = количество просмотров + количество покупок * 5
Еще проще, если бы в столбце rating твоей таблицы он бы и проставлялся...

Кстати столбцы views и orders тогда вообще не нужны
(если тольк они не используются где-то еще)
 
Сверху