MySQL Search w / Упорядоченные подстановочные знаки и извлечение их значений

Можно ли выполнить поиск по шаблону и извлечь значения подстановочных знаков и поместить их в результат MySQL? Предпочтительно, я также хотел бы наметить подстановочные знаки. Продолжайте читать, чтобы понять, что я имею в виду.

ПРИМЕР: Рассмотрим таблицу базы данных со следующей структурой.

+----+-------------------+ | id | content | +========================+ | 1 | %1.%2.%3 | +----+-------------------+ | 2 | Hey %name. | +----+-------------------+ 

Во-первых, обратите внимание, что это всего лишь пример . Я не сохраняю несколько значений в одном поле базы данных. См. Здесь: Действительно ли хранится список с разделителями в столбце базы данных?

Вместо этого я хочу знать, возможно ли иметь подстановочные знаки в базе данных, а затем сравнить это с пользовательским вводом. Другими словами, я хотел бы ввести пользовательский ввод, например 2.bla.^7 или аналогичный, а затем вернуть соответствующую строку -%.%.%. Затем я хотел бы взять эти подстановочные знаки и вернуть их как часть результата MySQL. Ниже приведен пример PHP mysql_fetch_assoc() основанный на том, что я ищу. Результат, очевидно, не обязательно должен быть изложен таким образом, но это тот результат, который я ищу.

ПРИМЕР:

 /************************ * Input: 2.bla.^7 * ************************/ Array ( [0] => Array ( [id] => 1, [content] => %1.%2.%3 ), [1] => Array ( [1] => 2, [2] => bla, [3] => ^7 ) ) /************************ * Input: Hey Matt. * ************************/ Array ( [0] => Array ( [id] => 2, [content] => Hey %1. ), [1] => Array ( [name] => Matt ) ) 

Я понимаю, что то, что я ищу, вероятно, довольно сложно или специализировано для моего уникального случая. Если вы можете указать мне в правильном направлении, я бы очень оценил это! Я даже не знаю, возможно ли это, если это не так, было бы полезно получить альтернативное решение! Однако я хочу, чтобы структура базы данных оставалась как можно ближе к ней.

Спасибо огромное!

На самом деле нет готового решения. Вот что я сделал бы:

1) Добавьте 3 специальных столбца like_pattern , regexp_pattern и placeholders . Их значения рассчитываются из content столбца либо в PHP перед загрузкой данных в таблицу, либо в ДОПОЛНИТЕЛЬНЫЕ ВСТАВКИ / ОБНОВЛЕНИЯ.

  • like_pattern VARCHAR(N) – шаблон LIKE для обратного поиска
  • regexp_pattern VARCHAR(N) – шаблон Regexp для извлечения частей позже в PHP
  • placeholders VARCHAR(N) – список имен заполнителей, разделенных запятыми

Вот пример:

 +----+-------------+--------------+--------------------+--------------+ | id | content | like_pattern | regexp_pattern | placeholders | +====+=============+==============+====================+==============+ | 1 | %1.%2.%3 | %.%.% | ^(.*)\.(.*)\.(.*)$ | 1,2,3 | +----+-------------+--------------+-+------------------+--------------+ | 2 | Hey %name. | Hey %. | ^Hey (.*)\.$ | name | +----+-------------+--------------+--------------------+--------------+ 

2) Для заданной записи строкового поиска с использованием like_pattern :

 SELECT * FROM patterns WHERE 'Hey Nathanael.' LIKE like_pattern; 

Имейте в виду, что простой индекс не может ускорить этот запрос, потому что мы выполняем обратный поиск, поэтому в зависимости от того, насколько велика ваша таблица, вам, вероятно, понадобится другое решение.

3) Сопоставьте строку «Hey Nathanael». против возвращенного regexp_pattern используя PHP preg_match() или ereg() . Вы получите значения заполнителя.

4) Объедините их с именами заполнителей из placeholders столбцов.

Вот и все.

Разве вы просто не хотите делать:

 SELECT * FROM patterns WHERE 'user input' LIKE content; 

Посмотрите на sqlfiddle .