Это звучит как обычное разбиение на страницы результатов, за исключением того, что вместо перехода на конкретную страницу в зависимости от запрашиваемого номера страницы или смещения она переходит на конкретную страницу в зависимости от того, где поиск пользователя вписывается в результаты по алфавиту.
Допустим, вы хотите получить 10 строк после этой позиции и 10 строк до нее.
Если пользователь ищет «Смит», вы можете сделать два выбора, например:
SELECT
name
FROM
companies
WHERE
name < 'Smith'
ORDER BY
name DESC
LIMIT 10
, а затем
SELECT
name
FROM
companies
WHERE
name >= 'Smith'
ORDER BY
name
LIMIT 10
Вы могли бы сделать UNION, чтобы получить это в одном запросе, вышеупомянутое просто упрощено.
Термин, который искал пользователь, соответствовал бы половине этих результатов. Если есть какие-либо точные совпадения, то первое точное совпадение будет расположено так, что оно будет одиннадцатым.
Обратите внимание, что если пользователь ищет «aaaaaaaa», то, вероятно, он просто получит 10 первых результатов, но перед ним ничего не будет, а для «zzzzzzzz» он может получить только 10 последних результатов.
Я предполагаю, что рассматриваемый механизм SQL позволяет> = и <сравнения между строками (и может оптимизировать это в индексах), но я не проверял это, может быть, вы не можете сделать это. Если, как и MySQL, он поддерживает интернационализированные параметры сортировки, то вы можете даже правильно упорядочить символы, не относящиеся к ascii. </em>