我将把它分成两部分:
我有一个用户,其中包含他想要的产品“功能”列表。要求用户从 1-10 对这些功能进行排名。我还有一张摆满产品的 table 。这些产品中的每一个都具有不同的功能。有些产品具有 1-10 的所有功能,但有些产品只具有其中的几个。我想确定哪个产品与用户的排名最匹配,并向用户提供一个有序的结果集,最好的匹配在前,最差的匹配在后。
上述查询实际上只是用户正在执行的操作的一部分。用户还提供其他搜索条件(例如产品类别、价格等)以及功能排名。因此,我希望功能匹配仅适用于通过这组过滤器的产品。我将如何组合这些?
我发现了一些类似的问题,例如 this和 this ,但它们还不够接近,我无法弄清楚如何将这些解决方案应用于我的情况。
涉及的表看起来像这样:
产品(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/