在MySQL中找到用户排名列表的最佳匹配

时间:2012-12-12 21:57:53

标签: php mysql algorithm

我会将其分为两部分:

  1. 我有一个用户,他有一个他想要的产品'功能'列表。要求用户对1-10中的这些功能进行排名。我还有一个装满产品的桌子。每种产品都具有各种功能。有些产品将具有1-10的所有功能,但有些产品只有少数产品。我想确定哪个产品与用户的排名最匹配,并向用户提供有序的结果集,最佳匹配优先匹配最后匹配。

  2. 上述查询实际上只是用户正在做的事情的一部分。用户还提供其他搜索标准(例如,产品类别,价格等)以及特征排名。所以,我希望功能匹配仅适用于通过这组过滤器的产品。我将如何结合这些?

  3. 我发现了一些类似的问题,例如thisthis,但它们并不足以让我弄清楚如何将这些解决方案应用到我的情况中。

    所涉及的表看起来像这样:

    产品(id,产品)

    功能(id,功能)

    product_features(id,product_id,feature_id)

    并且用户将通过这样的数组提交他的搜索(其中键实际上是特征ID,等级是值):

    [users_features] => Array
        (
            [1] => Array
                (
                    [rank] => 9
                )
    
            [2] => Array
                (
                    [rank] => 1
                )
    
            [3] => Array
                (
                    [rank] => 3
                )
    

    (这将是一个10项目阵列,但将来可能会改变)

        )
    

2 个答案:

答案 0 :(得分:0)

我不能仅仅使用SQL工作,但是一个简单的PHP解决方案将类似于以下(未经测试):

//Array of $productId => list of feature ids
$products;
$userFeatures;
$scores = array();
//For every product work out a score based on features and user ranking.
foreach($products as $productId => $prodFeatures){
    $score = 0;
    foreach($prodFeatures as $feature){
        //Could also perhaps penalise products lacking features.
        $score += $userFeatures[$feature]["rank"];
    }
    $scores[$productId] = $score;
}
arsort($scores);
echo "Best match is ".$scores[0];

显然这有点粗糙,准备好但希望它有所帮助。

编辑:这假设排名为10是最好的。

答案 1 :(得分:0)

解决方案是将1除以用户等级。例如1 / R.然后总结所有可能性并按后代顺序对列表进行排序。 1 / R也是不从列表中选择此产品的机会。当您需要对值进行标准化或使值的总和等于1时,您需要将该值乘以值的所有reziprokes的总和。例如,r1 = 30且r2 = 15。 1 /(1/30 + 1/15)= 10,所以P1 = 10 * 1/30 = 1/3,P2 = 10 * 1/15 = 2/3。标准化值时,也意味着具有较少属性的产品也不太可能。