这是一个示例 SQL 语句(用于 mysql),它应该可以执行您想要的操作。但是根据您的程序正在执行的其他操作,您可能会发现在 C# 代码中执行某些处理会更快:
SELECT
*
FROM
products
WHERE
size = [[desired_size]] OR
size IN (
SELECT DISTINCT
size
FROM
products
WHERE
size > [[desired_size]]
ORDER BY
size
LIMIT 50
)
OR
size IN (
SELECT DISTINCT
size
FROM
products
WHERE
size < [[desired_size]]
ORDER BY
size DESC
LIMIT 50
)
我将从头开始解释(并使用您的示例作为值)...
首先,我们需要生成接下来 50 个较大(或较小)项目的列表。以下查询应该这样做:
SELECT * FROM products WHERE size > 12 ORDER BY size LIMIT 50
所以,现在,我们正在从产品表中抓取所有大于所需尺寸的东西。我们按尺寸订购,然后将其限制为前 50 个。因此,在这种情况下,它应该返回(按此顺序)20 个尺寸为 13 的产品、20 个尺寸为 14 的产品和 10 个尺寸为 15 的产品。您可以尝试这在 Visual Studio SQL 编辑器中,并查看它返回的行。
但是出于我们的目的,我们只需要一个大小列表,因此我们可以通过将 SELECT 子句更改为:
SELECT DISTINCT size...
所以,现在我们只看“大小”列,我们使用 DISTINCT 关键字来避免重复值
所以现在,查询只返回列表: (13, 14, 15)
我们进行类似的查询以获取接下来的 50 个较小的项目:
SELECT DISTINCT size FROM products WHERE size < 12 ORDER BY size DESC LIMIT 50
这与上面的查询相同,但我们只限制了较小的尺寸,并且我们颠倒了顺序,所以我们得到了小于所需尺寸的 50 个最大的项目。
在这种情况下,此查询将返回列表 (11, 10, 9)
如果我们使用这两个列表将它们放在外部查询中,我们会得到:
SELECT
*
FROM
products
WHERE
size = 12 OR
size IN (13, 14, 15) OR
size IN (11, 10, 9)
所以我们拉所有尺寸为9到15的产品
我希望这是有道理的 :-)