Можно ли выполнить поиск по шаблону и извлечь значения подстановочных знаков и поместить их в результат 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 .