php - 在 MySQL 中为用户排名列表找到最佳匹配

标签 php mysql algorithm

我将把它分成两部分:

  1. 我有一个用户,其中包含他想要的产品“功能”列表。要求用户从 1-10 对这些功能进行排名。我还有一张摆满产品的 table 。这些产品中的每一个都具有不同的功能。有些产品具有 1-10 的所有功能,但有些产品只具有其中的几个。我想确定哪个产品与用户的排名最匹配,并向用户提供一个有序的结果集,最好的匹配在前,最差的匹配在后。

  2. 上述查询实际上只是用户正在执行的操作的一部分。用户还提供其他搜索条件(例如产品类别、价格等)以及功能排名。因此,我希望功能匹配仅适用于通过这组过滤器的产品。我将如何组合这些?

我发现了一些类似的问题,例如 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 个项目的数组,但将来可能会改变)

    )

最佳答案

我不能完全使用 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 是最好的。

关于php - 在 MySQL 中为用户排名列表找到最佳匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13849395/

相关文章:

algorithm - 索引集列表的高效数据结构

algorithm - 通过遍历图生成给定字符串的步骤

algorithm - 使用 Map/Reduce 算法对单词进行计数

php - Laravel 获取当前路线

php - Codeigniter get_where 查询

mysql - (行到列/数据透视)+ SUM

mysql - 如何将所有权限恢复到 MySQL 中的 root 用户?

javascript - 如何停止使用 onload() 函数以避免页面刷新时丢失 PHP 输出?

php - PDO异常 : SQLSTATE[HY000] [2006] MySQL server has gone away

mysql - 在 REST API Java Spring Boot 中杀死慢速查询