MySQL SELECT первая буква слов последовательно для поиска

Примеры слов:

iknkr st nm krt prk
iknkr vhgr j k pth  
iknkr hkm st
iknkr sr vhgr j k pth

Обязательное условие

Теперь, если пользователь печатает: ik s запрос вернет:

iknkr st nm krt prk 
iknkr sr vhgr j k pth

если пользователь вводит: i v запрос вернет:

iknkr vhgr j k pth

В настоящее время пытаюсь:

SELECT `walpha` AS word, pageID AS id 
FROM `SX01` 
WHERE `table`= 'S01' 
  AND `walpha` like '" . $this->db->escape_like_str($searchVal['keyword']) . "%' 
LIMIT 100"

Но с помощью этого пользователя нужно набрать: iknkr s

чтобы получить результат

iknkr st nm krt prk 
iknkr sr vhgr j k pth

Может кто-нибудь подсказать, каким будет правильный способ сделать это.

3 ответа

Решение

Вы можете создать регулярное выражение из ввода и затем использовать REGEXP, чтобы MySQL использовал его. Например, вы можете включить ik s в ^ik[a-z]* s сопоставить слова, которые начинаются с ik с последующим словом, начинающимся с s...

SELECT words FROM tbl WHERE t.words REGEXP '^ik[a-z]* s';
  • ^ означает, что мы должны соответствовать с начала строки
  • ik должны быть первые два символа
  • [a-z] будет соответствовать любой строчной буквенный символ
  • * позволяет нам соответствовать нулю или более предыдущего шаблона - то есть любая последовательность символов может следовать ik
  • тогда должно быть место
  • s сопровождаемый s - мы не заботимся о том, что следует.

Вы можете построить этот шаблон из пользовательского ввода, заменив все пробелы [a-z]* и префикс с ^

Если я правильно понимаю вашу логику, вы можете попробовать выполнить такой запрос:

select `walpha` AS word, pageID AS id
from `SX01` 
where
  `table`= 'S01' 
  and `walpha` like concat(replace('" . $yoursearchval . "', ' ', '% '), '%') 
limit 100

например:

concat(replace('i k', ' ', '% '), '%')

станет:

i% k%

но если вы хотите, чтобы слова были последовательными, вам придется использовать регулярное выражение:

where whalpa regexp concat('^', replace('i k', ' ', '[^[:space:]]+ '))

и ик станет:

^i[^[:space:]]+ k
  • строка должна начинаться с I
  • после того, как я должен быть по крайней мере + один непробельный символ
  • затем один пробел
  • тогда один к
  • тогда что-нибудь еще

выберите идентификатор, заголовок, верхний (левый (заголовок,1)) как FirstLetter из магазина, порядок по заголовку

Другие вопросы по тегам