我会将其分为两部分:
我有一个用户,他有一个他想要的产品'功能'列表。要求用户对1-10中的这些功能进行排名。我还有一个装满产品的桌子。每种产品都具有各种功能。有些产品将具有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项目阵列,但将来可能会改变)
)
答案 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。标准化值时,也意味着具有较少属性的产品也不太可能。