由于标点符号,MySQL查询不匹配

时间:2015-06-18 14:00:42

标签: php mysql database

我有一个查询,我试图将一个表上的查询结果与另一个表上的查询结果进行匹配。我遇到的问题是第一个表的结果有时可能包含标点符号,导致它与其他表结果不匹配,即使理想情况下也是如此。

例如,表1中返回的值可能是“Acme,Inc。”,而在第二个表中,它显示为“acme inc”。在某种程度上,有没有办法迫使这些相匹配?

感谢您的帮助!

3 个答案:

答案 0 :(得分:3)

您可以使用regex或使用通配符匹配。

所以你可以使用:

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

这将匹配任何有“极致”的东西。在其中,%表示之前/之后的任何内容。

只是一个额外的想法,可能比使用正则表达式更简单,用,替换任何%是一件容易的事,然后将其用作搜索字符串。然后它将通配符表示char。

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

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

更新

如果你想使用正则表达式,只需将你的搜索字符串拆分成字符的部分,然后从中构建一个模式。 (这将在标点符号上分开并摆脱任何空格)

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

这将为您提供一个包含3个部分的数组,整个字符串以及拆分位#39;然后只是迭代它们并构造一个友好的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

答案 1 :(得分:0)

使用REPLACE功能替换点。

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替换

答案 2 :(得分: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 inc”和“Acme Amalgamated Foo&amp; Bar Co.,Inc。”。但是,根据我的经验,不同表格中名称之间的差异不仅仅是标点符号。