Вот пример оператора 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...
Итак, теперь мы смотрим только на столбец «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
.
Надеюсь, это имеет смысл: -)