2013-05-07 24 views
5

sorgunun amacı, yanlış yazılmış adların olası kopyalarını bulmaktır. Örnek:MySQL İçerisine Çoklu Koşullar Ekleme

International Group Inc. bu kullanılmış bir sonraki sorgu gerçekleştirmek amacıyla International, Group Inc

tekrarı olarak bulmak olmalıdır: Çok iyi çalışıyor

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, '.', ''), ',', '') 

ve sonucu 40 secs ama bir ekleme geldi AND C.city_id='4' gibi ekstra şartlar ekstra dakika veya daha fazla gerektirir; Bu hala kabul edilebilir, ancak tercih edilmez.

Gerçek sorunum, yalnızca özel bir dize sahip şirketlerin çoğunu bulmak için başka bir koşul eklemeyi denediğimde, bu koşulu kullanarak AND C.name LIKE '%International%' bu yalnızca herhangi bir sonuç döndürmüyor oluşuyor.

Birisi yanlış yaptığımı anlamaya yardım edebilir mi?

Teşekkür

+0

Ne yazık ki, bu senaryoda endeksler etkin kullanımını sağlamak sanmıyorum - 1 dakika rağmen + son derece yavaş görünüyor. – Strawberry

cevap

6

bir fonksiyonun sonucunu katılmadan olduğundan, sorgu herhangi endeksi kullanamazsınız. Ayrıca, tüm satırlarda REPLACE() yürütme maliyeti büyük olasılıkla göz ardı edilemez.

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 bir sürebilir Koşu:

ben ilk dizeleri "soyulmuş aşağı" versiyonunu alan bir dizine sütun eklemek ve sonra bir bu sütunda katılmak ile sorgu çalıştırmak önermek ilk kez ama ON UPDATE ve company üzerinde ON INSERT tetikleyici de ayarlayabilirsiniz böylece stripped_name doldurulur ve anında güncelleştirilir. Şirkette foreach satır tmp tablo oluşturulacaktır çünkü

+0

Bu harika bir fikir - ve bariz (bunu düşünmese bile!) – Strawberry

+0

Bu çözüm performansı gerçekten arttırıyor, ancak yine de şirket adına özel bir dize ararken sonuç elde edemiyorum. 'VE E.stripped_name LIKE '% Uluslararası%'. Neden olabilir? – gustyaquino

+1

@gustyaquino Eşleşen bir satır olduğundan emin misiniz? Büyük/küçük harfe duyarlı bir harmanlama kullanıyor olabilirsiniz. Lütfen tablonuzun tam yapısını gösteriniz ('SHOW CREATE TABLE company;') – RandomSeed

0

tmp tablodan başlayarak deneyin:

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, '.', ''), ',', '')