根据产品功能排名

时间:2016-08-02 10:53:57

标签: java mysql ranking

我在$obj = PHPExcel_IOFactory::load('excel.xlsx'); $reportWriter = new PHPExcel_Writer_Excel2007($obj); $reportWriter->setIncludeCharts(true); header('Content-type: application/vnd.ms-excel;charset=UTF-8'); header('Content-Disposition: attachment;filename=excel.xlsx'); header('Cache-Control: max-age=0'); $reportWriter->save('php://output'); 数据库中有以下表格:

  1. 产品

    • PRODUCT_ID
    • PRODUCT_NAME
    • product_catagory_id_fk
  2. product_features

    • FEATURE_ID
    • product_id_fk
    • FEATURE_NAME
  3. 我需要根据产品的功能为产品添加排名设施

    排名将从1到100开始,例如取决于产品的功能,

    为每个功能提供重量"并定义产品的总体评分"作为其组件功能的总和,

    权重是实现这一目标的一种方式,

    最终它将用于比较同一类别的产品

    您能否提出以下建议:

    • 我需要添加哪些新表
    • 我需要将哪些列添加到现有表格
    • 如何计算与表相关联的排名

    所有帮助将不胜感激

2 个答案:

答案 0 :(得分:1)

  1. 为每个功能赋予权重:

    ALTER TABLE product_features ADD COLUMN weight INT;
    UPDATE product_features SET weight = ? WHERE feature_id = ?; -- and repeat
    
  2. 选择产品(与其功能相结合,然后分组),按总分排序:

    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
    
  3. 或者获取特定产品的排名:

    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
    

答案 1 :(得分:1)

首先,您需要为功能创建一个单独的表格,其中相关权重(如)的权重为1,中等具有权重2,重量为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