2011-05-31 198 views
2

我正在尝试构建产品的过滤系统。产品有许多属性,包括价格,尺寸(厘米)和(#)的侧面。我想构建一个SQL查询,它总是返回ALL这些产品,但是会根据它们符合搜索条件的顺序对它们进行排序。SQL查找近似匹配

例如可以说我有以下产品:

产品A 价格:250 尺寸:50个 面:4

产品B 价格:300 尺寸:60 面积:3

产品C 价格:200 尺寸:60个 侧面:5

而且具有的搜索条件:

价格:$器210 - $ 260

我想它返回: 商品A,商品C,产品B

A首先是因为它符合所有搜索条件。 C领先于B,因为200美元最接近210美元-260美元范围,而不是300美元。

这是一个相当简单的情况,但搜索可能涉及任何属性。

我脑海中的算法是对每个属性做一些标准偏差计算,它会给你一个关于该属性满足搜索标准的密度的“分数”,这些分数可以被归结为一个产品给出产品的相关性总分。那是沿着正确的轨道吗?

我意识到这是一个相当复杂的问题,我真的只是寻找一些指导而已。

+2

我认为你有你的A,B和C混合起来。 B应该首先归还,因为它在价格范围内。 C应该返回第二个(10美元以外),然后A(40美元以外)。 – 2011-05-31 05:09:54

+0

哎呀......你说得对。我将进行编辑。 – Mike 2011-05-31 21:16:04

回答

4

基本上你必须为每一行提供一个“距离”函数,如果所有条件都匹配,则返回0,否则返回一个正值表示距离多远。每个不同的列将不得不具有一定的权重,因为减少1美元并不像离开1个方面那么遥远。如果价格低于210,则未加权距离将是(210 - 价格),如果价格超过260,则价格列的未加权距离将是(价格-260)。然后,您可以将加权距离加起来w1 * price_distance + w2 * size_distance + s3 * sides_distance。然后你可以按距离做一个订单。

+0

正是我需要的!谢谢! – Mike 2011-05-31 06:55:55

3

如何计算平均值,然后通过偏离平均值的顺序进行排序?我想象这样的事情(很明显,你的表/列名会有所不同):

SELECT 
    p.price, 
    p.size, 
    p.sides, 
    ABS(p.price - 235) AS distance 
FROM 
    products p 
ORDER BY 
    distance; 

当然,你可能也想在IF函数抛出来评估价格是否是在范围内,我建议在后面使用参数化查询,而不是直接输入平均值。

+0

根据其他评论者,您也可能想要为每个属性分配一个权重,将它们彼此归一化,然后将它们相加。例如,ABS(p.price - 235)* 0.2 AS price_distance,ABS(p.size - 45)* 2.5 AS size_distance,ABS(p.sides - 3)* 20 AS side_distance,price_distance + size_distance + side_difference AS total_deviation。 – 2011-05-31 05:34:17

+0

两个很好的答案。谢谢! – Mike 2011-05-31 06:58:21