Php 在MySQL中查找用户排名列表的最佳匹配项

Php 在MySQL中查找用户排名列表的最佳匹配项,php,mysql,algorithm,Php,Mysql,Algorithm,我将把它分为两部分: 我有一个用户,他有一个他想要的产品“功能”列表。要求用户将这些功能从1到10进行排名。我也有一桌的产品。每种产品都有不同的特点。有些产品将具有所有功能1-10,但有些产品将只有少数功能。我想确定哪个产品与用户的排名最匹配,并向用户提供一个有序的结果集,最好的匹配在前,最差的匹配在后 上述查询实际上只是用户正在做的事情的一部分。用户还提供其他搜索条件,如产品类别、价格等以及功能排名。所以,我希望功能匹配只适用于通过这组过滤器的产品。我将如何组合这些 我发现了一些类似的问题,如

我将把它分为两部分:

我有一个用户,他有一个他想要的产品“功能”列表。要求用户将这些功能从1到10进行排名。我也有一桌的产品。每种产品都有不同的特点。有些产品将具有所有功能1-10,但有些产品将只有少数功能。我想确定哪个产品与用户的排名最匹配,并向用户提供一个有序的结果集,最好的匹配在前,最差的匹配在后

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

我发现了一些类似的问题,如和,但它们还不足以让我找出如何将这些解决方案应用于我的情况

所涉及的表格如下所示:

产品id,产品

特征id,特征

产品特征标识,产品标识,特征标识

用户将通过这样的数组提交搜索,其中键实际上是特征ID,秩是值:

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

        [2] => Array
            (
                [rank] => 1
            )

        [3] => Array
            (
                [rank] => 3
            )
这将是一个10项的数组,但在未来可能会发生变化

    )

我无法仅使用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除以用户排名。例如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。当您规范化该值时,这也意味着属性较少的产品也不太可能出现。

我在这里看到的一个问题是,具有所有功能的产品将始终排在列表的顶部-除非这样。您需要一种方法将排名应用于功能。例如,如果一个产品只匹配排名=1,而另一个产品匹配排名=2和3,那么选择哪一个?@EricPetroleje如果所有具有所有功能的产品都排名靠前就可以了。这似乎很有趣,但就我而言,我不太明白如何应用它。在您的示例中,r1和r2是功能1和功能2的等级吗?P1和P2产品是1和2吗?1是2否。P1和P2也是特征的等级,但经过规范化,因此所有的总和为1.ah!我现在明白了…根据每个产品的特性对其进行评分是有意义的,并且仍然使用1作为最高等级。关于如何构造查询,您有什么建议吗?您的评分概念和使用10作为最佳排名非常有意义。我已经运行了一些电子表格场景,它似乎表现得相当好。你会建议我先运行“过滤器”查询,然后从结果集中构建一个产品数组,然后跳转到这个评分函数中吗?我最终同意你的方法。我运行了筛选查询,然后使用结果中的产品ID数组开始这个评分例程。谢谢