【问题标题】:Find the best match in MySQL for user-ranked list在 MySQL 中为用户排名列表找到最佳匹配
【发布时间】:2012-12-12 21:57:53
【问题描述】:

我将把它分成两部分:

  1. 我有一个用户列出了他想要的产品“功能”。要求用户从 1-10 对这些特征进行排名。我还有一张摆满产品的桌子。这些产品中的每一个都有不同的功能。有些产品将具有 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 项数组,但将来可能会改变)

    )

【问题讨论】:

  • 我在这里看到的一个问题是,具有所有功能的产品将始终排在列表的顶部——除非没问题。
  • 您需要一种将排名应用于特征的方法。例如,如果一个产品只匹配 rank = 1,而另一个匹配 rank = 2 和 3,那么选择哪个?
  • @EricPetroelje 如果所有具有所有功能的产品都排在首位,那没关系。

标签: php mysql algorithm


【解决方案1】:

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

【讨论】:

  • 您的评分概念和使用 10 作为最佳排名很有意义。我已经运行了一些电子表格方案,它似乎表现得相当好。你会建议我先运行“过滤器”查询,然后从该结果集中构建一个产品数组并跳转到这个评分函数吗?
  • 我最终选择了你的方法。我运行了我的过滤器查询,然后使用该结果中的一组产品 ID 来开始这个评分程序。谢谢!
【解决方案2】:

解决方法是用 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。当您将值标准化时,也意味着具有较少属性的产品也不太可能。

【讨论】:

  • 这看起来很有趣,但对于我的生活,我不太明白如何应用它。您的示例中的 r1 和 r2 是特征 1 和 2 的行列吗? P1 和 P2 产品是 1 和 2 吗?
  • 1) 是 2) 不是。 P1 和 p2 也是特征的等级,但经过归一化处理后,总和为 1。
  • 啊!我现在明白了...作为一种根据每个产品的功能对其进行评分的方式是有意义的,并且仍然使用 1 作为最高排名。您对如何构建查询有什么建议吗?
猜你喜欢
  • 2013-09-14
  • 1970-01-01
  • 2012-03-08
  • 2014-02-24
  • 2019-11-30
  • 2011-01-22
  • 1970-01-01
  • 1970-01-01
  • 2019-04-16
相关资源
最近更新 更多