我正在尝试为产品构建过滤系统。产品有许多属性,包括价格,尺寸(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美元。
这是一个相当简单的案例,但搜索可能涉及任何属性。
我脑子里的算法是为每个属性做一些标准偏差计算,这会给你一个关于该属性与搜索标准的接近程度的“得分”,这些得分可以在产品中总结出来给出产品的相关性总分。那是沿着正确的轨道吗?
我意识到这是一个相当复杂的问题,我真的只是寻求一些指导。
答案 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函数来评估价格是否在范围内,我建议在后面使用参数化查询,而不是直接提供平均值。