查找鞋码选择

Sha*_*lva 6 mysql

我正在开发一个功能,允许用户输入他们的脚尺寸并返回合适的鞋码。我很难决定实现此功能的最佳方式。

我在下面的查询是我想出的。它返回长度和宽度不同的两个最接近的结果。返回的差异可能是正数或负数,但是,负数当然是一个问题,因为这表明返回的大小对于用户的尺寸来说太小了。

我正在寻求帮助的部分是如何排除小于用户输入的尺寸。

询问

SELECT
    size_name,
    length,
    ABS(length - ' . $input->length . ') AS length_difference,
    width,
    ABS(width - ' . $input->width . ') AS width_difference
FROM
    SIZES
LIMIT
    2
ORDER BY
    length_difference
Run Code Online (Sandbox Code Playgroud)

结果

{
    "size_name": "8",
    "length": 10.3,
    "length_difference": 0.15,
    "width": 3.8,
    "width_difference": 0.4
},
{
    "size_name": "9",
    "length": 10.6,
    "length_difference": 0.15,
    "width": 3.9,
    "width_difference": 0.3
}
Run Code Online (Sandbox Code Playgroud)

更新

我一直在调整并意识到这并不像我做的那么难。在下面的屏幕截图中,我有一些接近的东西。我正在使用 PHP,所以我想我可以过滤掉负值,然后我显然有大小 9。这看起来像一个有效的解决方案吗?

在此处输入图片说明

小智 1

因此,您似乎缺少 where 子句,该子句会过滤掉不需要的结果。在此示例中,我假设 2 是一个合适的阈值,并使用 Between 子句来限制输出。大于限制也可以工作,但这实际上取决于数据集。

SELECT
    size_name,
    length,
    ABS(length - ' . $input->length . ') AS length_difference,
    width,
    ABS(width - ' . $input->width . ') AS width_difference
FROM
    SIZES
WHERE 
    length BETWEEN $input->length AND ($input->length + 2)
    AND width BETWEEN $input->width AND ($input->width + 2)

ORDER BY
    length_difference
LIMIT 2
Run Code Online (Sandbox Code Playgroud)

这是使用大于的示例。

SELECT
    size_name,
    length,
    ABS(length - ' . $input->length . ') AS length_difference,
    width,
    ABS(width - ' . $input->width . ') AS width_difference
FROM
    SIZES
WHERE 
    length > $input->length
    AND width > $input->width

ORDER BY
    length_difference
LIMIT 2
Run Code Online (Sandbox Code Playgroud)