Ранжирование на основе характеристик продукта
У меня есть следующие таблицы в mysql
база данных:
товары
- Код товара
- наименование товара
- product_catagory_id_fk
product_features
- feature_id
- product_id_fk
- FEATURE_NAME
Мне нужно добавить ранжирование продуктов в зависимости от их функций,
Рейтинг будет начинаться с 1 до 100, например, в зависимости от характеристик продукта,
Присваивая каждой функции "вес" и определяя общую "оценку" продукта как сумму его компонентов,
Вес будет одним из способов достижения этого,
В конце концов он будет использоваться для сравнения продуктов в той же категории,
Можете ли вы предложить следующее:
- Какие новые таблицы мне нужно добавить
- Какие столбцы мне нужно добавить в существующие таблицы
- Как рассчитать рейтинг для привязки к таблицам
Вся помощь будет оценена
2 ответа
Дайте каждой функции вес:
ALTER TABLE product_features ADD COLUMN weight INT; UPDATE product_features SET weight = ? WHERE feature_id = ?; -- and repeat
Выберите продукты (объединенные с их функциями и затем сгруппированные), отсортированные по общему количеству баллов:
SELECT p.*, SUM(f.weight) AS score FROM products p JOIN product_features f ON f.product_id_fk = p.product_id GROUP BY p.product_id ORDER BY score DESC
Или получить звание конкретного товара:
SELECT 1+COUNT(*) AS rank FROM ( SELECT NULL FROM product_features GROUP BY product_id_fk HAVING SUM(weight) > ( SELECT SUM(weight) FROM product_features WHERE product_id_fk = ? -- your product_id here ) ) t
Прежде всего, вам нужно создать отдельную таблицу для объектов с соответствующим весом, например, у Small есть вес 1, у Medium вес 2, у Large вес 3 и так далее.
Так что теперь таблица функций будет что-то вроде
features
- feature_id
- feature_name
- feature_weight
Создать отдельную таблицу для product_feature_associations
product_feature_associations
- product_id_fk
- feature_id_fk
Вы также можете добавить новый столбец product_ranking в таблицу продуктов, чтобы избежать массового расчета во время выборки списка продуктов. Каждый раз, когда вы связываете новую функцию с любым продуктом, обновляйте это поле product_ranking, вычисляя связанный вес. Это сэкономит вам много времени, но вам необходимо отслеживать все действия в таблице product_feature_associations, как будто вы должны отслеживать добавление, редактирование, удаление действий в таблице product_feature_associations и соответственно обновлять product_ranking.