2015-06-18 2 views
2

У меня есть запрос, в котором я пытаюсь сопоставить результаты запроса из одной таблицы с результатами запроса в другой таблице. Проблема, с которой я столкнулась, состоит в том, что результаты из первой таблицы иногда могут содержать знаки пунктуации, которые не могут соответствовать другим результатам таблицы, хотя в идеале это было бы.Запрос MySQL не соответствует из-за пунктуации

Например, возвращаемое значение из таблицы 1 может быть «Acme, Inc.», тогда как во второй таблице оно отображается как «acme inc». Есть ли способ, чтобы заставить их соответствовать?

Благодарим за помощь!

+0

с полнотекстовым индексом, да. с 'где foo = 'acme.inc'' или' where foo like' acme.inc'', нет, не без серьезного искажения условий. –

ответ

3

Вы можете использовать regex или использовать подстановочный знак.

так что вы можете использовать:

select * from tablename where companyname LIKE '%acme%' 

это будет соответствовать все, что имеет «Акме» в этом,% означает, что-либо до/после.

Просто лишняя мысль, которая может быть проще, чем при использовании регулярного выражения, было бы легко заменить любое , на %, а затем использовать это как строку поиска. Затем он подстановит этот символ.

$searchstring = str_replace(',', '%', $originalstring); 

$qry = "select * from tablename where companyname LIKE '%$searchstring%"' 

обновление

если вы хотите использовать регулярное выражение, просто разделить вашу строку поиска в часть на персонажах, а затем построить шаблон из этого. (Это будет разделен на знаки препинания и избавиться от любых пространств)

preg_match("/(.*)\p{P}(.*)/", str_replace(' ', '', $searchstring), $output_array); 

это даст вам массив с 3-х частей, всей строки, и расщепленных «бит». затем просто перебирайте их и создайте дружественную строку mysql. (Мы хотим, чтобы пропустить первый, Hense $key начиная с 1)

$pattern = ''; 
for($key = 1; $key < count($output_array); $key++) { 
    $pattern .= $output_array[$key] . '.*'; 
} 

$qry = "select * from database where companyname REGEXP '$pattern'"; 

Херес fiddle

+0

Я бы подумал, что регулярное выражение - это путь, но если я получаю результаты из первой таблицы, как это использовать, чтобы динамически создавать регулярное выражение, если это имеет смысл? – jldavis76

+0

обновил мой ответ. извините за задержку, работа мешала. – DevDonkey

0

Используйте ЗАМЕНЫ функцию для замены точек.

https://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_replace

SELECT * FROM your_table 
WHERE REPLACE(some_col, ".", "") LIKE "%acme%"; 

SELECT * FROM your_table 
WHERE REPLACE(REPLACE(some_col, ".", ""), ",", "") = "acme inc"; 

Я не знаю, если заменить функцию принимает регулярное выражение для использования только 1 заменить

0

Вы можете сделать это путем удаления знаков препинания. , , если вы знаете, что строки в противном случае похожи. Например:

from table1 t1 join 
    table2 t2 
    on t2.name = replace(replace(t2.name, '.', ''), ',', '') 

Вы, возможно, придется добавить еще replace() вызовов. Другой способ заключается в использовании поиска по шаблону, в другом направлении:

from table1 t1 join 
    table2 t2 
    on t2.name like concat('%', replace(t1.name, ' ', '%'), '%') 

Конечно, это будет соответствовать "Acme вкл" и "Acme Amalgamated Foo Bar & Co., Inc.". Однако, по моему опыту, разница между именами в разных таблицах больше, чем просто пунктуация.

Смежные вопросы