我正在建立一个网站,人们可以根据他们的体重和身高获得一些信息。一个人将如何构造一个查询,它会给我一行与用户输入的最接近的两个特定值的行?
我在 stackoverflow 上找到了这个,它非常有帮助。我正在尝试完成与仅使用 2 个值为 1 的类似的事情。
如果体重和身高同等重要,可以使用这个(线性)
select top 1 *
from tbl
order by ABS(weight-@weight) + ABS(height-@height)
更好的选择可能是在一个尺度上权衡差异,例如将 0.01m (1cm) 的高度equal
作为 1kg。两边也平方,所以 5cm 和 5kg 的偏差被视为比 10cm 和 0kg 更“接近”。
(假设所有输入都以公斤和米为单位)
select top 1 *
from tbl
order by ABS(weight-@weight)^2 + (ABS(height-@height)*100)^2
与其尝试做一些巧妙的 SQL 技巧来适应这一点,不如限制用户输入(使用下拉列表、四舍五入到最接近的值等)以匹配数据集中可用的值。
两者的平均差是多少?我建议给身高差一个更高的权重,因为 6 英寸的差值比 6 磅的差值要大得多。例如:
SELECT * FROM table
ORDER BY ABS(weight - @weight) + ABS(height - @height)*3
这只是我试图让身高差异更重要的尝试。在这个例子中,我给它的权重为 3。这个例子假设一个人的身高以英寸为单位……如果你以厘米为单位,它可能会更好。