5

查询的目的还在于找出可能出现的输入错误名称的重复项。例子:

International Group Inc.必须作为副本找到International, Group Inc

为了做到这一点,使用了下一个查询:

SELECT C.id,
       C.name,
       C.address,
       C.city_id
FROM   company C
       INNER JOIN (SELECT name
                   FROM   company
                   GROUP  BY name
                   HAVING Count(id) > 1) D
               ON Replace(Replace(C.name, '.', ''), ',', '') =
                  Replace(Replace(D.name, '.', ''), ',', '')  

它工作得很好,结果出来了,40 secs但是添加一个额外的条件,比如AND C.city_id='4'需要额外的一分钟或更长时间;这仍然是可以接受的,但不是可取的。

当我尝试添加另一个条件以仅找出名称中包含特定字符串的公司的重复项时,我的真正问题发生了,使用此条件AND C.name LIKE '%International%',这只是不返回任何结果。

有人可以帮我弄清楚我做错了什么吗?

谢谢

4

2 回答 2

6

因为您要加入函数的结果,所以查询不能使用任何索引。此外,在所有行上执行的成本REPLACE()可能不可忽略。

我建议您首先添加一个接收“精简”版本字符串的索引列,然后在此列上运行带有连接的查询:

ALTER TABLE company ADD COLUMN stripped_name VARCHAR(50);
ALTER TABLE company ADD INDEX(stripped_name);
UPDATE TABLE company SET stripped_name = REPLACE(REPLACE(name, '.', ''), ',', '') ;

第一次运行UPDATE可能需要一段时间,但您也可以设置一个ON UPDATE和一个ON INSERT触发器,company以便stripped_name即时填充和更新。

于 2013-05-07T12:27:17.673 回答
0

尝试从 tmp 表开始,因为公司中的每一行都会创建一个 tmp 表:

SELECT C.id,
       C.name,
       C.address,
       C.city_id
FROM (SELECT name
                   FROM   company
                   GROUP  BY name
                   HAVING Count(id) > 1) D  
INNER JOIN company C       
               ON Replace(Replace(C.name, '.', ''), ',', '') =
                  Replace(Replace(D.name, '.', ''), ',', '')  
于 2013-05-07T12:28:23.990 回答