SQL查找接近的匹配项


SQL find close matches

我正在尝试为产品构建一个过滤系统。产品具有许多属性,包括价格、尺寸(cm)和侧面(#)。我想构造一个SQL查询,它总是返回ALL产品,但根据它们符合搜索条件的程度对它们进行排序。

例如,假设我有以下产品:

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

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

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

并且有一个搜索标准:

价格:210美元-260美元

我希望它返回:产品A、产品C、产品B

A是第一个,因为它符合所有搜索条件。C领先于B,因为200美元比300美元更接近210美元至260美元的区间。

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

我脑海中的算法是对每个属性进行某种标准差计算,这会给你一个该属性与搜索标准的"分数",这些分数可以在一个产品中相加,得出该产品的相关性总分。这是正确的吗?

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

基本上,您必须为每一行想出一个"距离"函数,如果所有条件匹配,该函数将返回0,否则将返回一些正值,指示距离有多近。每个不同的列都必须有一定的重量,因为偏离1美元并不像偏离1个边那么远。对于价格,如果低于210,则未加权距离为(210-价格),如果价格高于260,则价格列的未加权距离将为(价格-260)。然后,可以将加权距离w1*price_distance+w2*size_distance+s3*side_istance相加。然后你可以按距离排序。

计算平均值,然后根据与平均值的偏差排序如何?我想象的是这样的(很明显,你的表/列名会有所不同):

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

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