为MySQL Inner Join添加多个条件

时间:2013-05-07 12:16:51

标签: mysql sql

查询的目标还在于找到错误输入的可能重复的名称。例如:

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%',这只是不返回任何结果。

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

由于

2 个答案:

答案 0 :(得分: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 INSERTcompany个触发器,以便stripped_name得到填充并即时更新。

答案 1 :(得分:0)

尝试从tmp表开始,因为公司中的foreach行将创建一个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, '.', ''), ',', '')