SQL查找紧密匹配

时间:2011-05-31 05:01:33

标签: php mysql database oracle postgresql

我正在尝试为产品构建过滤系统。产品有许多属性,包括价格,尺寸(cm)和(#)边。我想构建一个始终返回 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 个答案:

答案 0 :(得分:4)

你基本上必须为每一行提出一个'距离'函数,如果所有条件匹配则返回0,否则一些正值表示接近。每个不同的列必须具有一些重量,因为关闭1美元并不远离关闭1个数量的边。如果价格低于210,未加权距离将是(210 - 价格),如果价格超过260,价格列的未加权距离将是(价格 - 260)。然后你可以加权加权距离w1 * price_distance + w2 * size_distance + s3 * sides_distance。然后你可以按距离做订单。

答案 1 :(得分:3)

如何计算平均值,然后按偏离平均值排序?我想象的是这样的事情(显然,你的表/列名称会有所不同):

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

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