为MySQL Inner Join添加多个条件

gus*_*ino 5 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, '.', ''), ',', '')  
Run Code Online (Sandbox Code Playgroud)

它运作良好,结果来了,40 secs但增加一个额外的条件,如AND C.city_id='4'需要额外一分钟或更多; 这仍然可以接受但不是优选的.

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

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

谢谢

Ran*_*eed 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, '.', ''), ',', '') ;
Run Code Online (Sandbox Code Playgroud)

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