2015-01-07 54 views
0

所以我試圖合併兩個公司信息數據庫(表A和表B從這裏出),其中最常見(和可靠)的單一參考點是網站的URL。表A是最新的,表B是要更新的。MySQL確切的URL搜索

我已經從表A中提取URL並使用PHP(約6000個URL)進行了清理,計劃是根據找到的URL(而不是URL本身)找到並更新表B中的一些信息。

在表A中,所有的URL都是domain.comwww.domain.comwww.subdomain.domain.com沒有http://或任何尾隨/其他URL數據。在表B它們可能包含與他們如http任何額外信息的原始網址://等

現在,我已經試過表B像這樣尋找公司通過網址:

SELECT * FROM companies WHERE website LIKE '%$url1%' OR website LIKE '%$url2%'... 

雖然這可行,但它也會提取不正確的信息。例如,我沒有表A中列表中的bt.com(或其中的任何變體),但它在表B中匹配(表A中有www.corporate.bt.com,我認爲它與它匹配)。

那麼,我該如何阻止這種情況發生?它顯然在URL列表中發現了一些類似的內容,但我只想匹配確切的字符串。所以在上面的例子,如果我在尋找www.corporate.bt.com它應該只返回,如果它發現它在字符串中(http://www.corporate.bt.com/是好的,http://bt.com/不是)

而且,這將是執行此的最好方式數據集這樣大的動作?表A有大約6,000個URL,表B有14,000個(表A中並非全部將在表B中)。

回答

0

LIKE不會返回精確的搜索,但你可以使用MySQL REGEXP對於精確搜索,它會發現在搜索提交準確的結果,並且只返回準確的URL

SELECT * FROM companies WHERE website REGEXP '[[:<:]]$url1[[:>:]]' OR 
           website REGEXP '[[:<:]]$url2[[:>:]]' 

或者,如果申請只有單一的URL,那麼你可以使用=操作

SELECT * FROM companies WHERE website = '$url1' OR website = '$url2' 

UPDATE 在此你可以花費正則表達式serarch和輸入只有SERVER_NAMEdomain.comdomain1.comabc.domain.com,請參見下面的查詢

$url = "doamin.com"; 
$url1 = "domain1.com"; 
SELECT * FROM companies WHERE 
    website REGEXP '^(htt(p|ps):\/\/|htt(p|ps):\/\/www\.)($url)$' OR 
    website REGEXP '^(htt(p|ps):\/\/|htt(p|ps):\/\/www\.)($url1)$' 
+0

恐怕這不能按預期工作。第一個和LIKE拉同樣的結果。第二個不會工作,就好像我正在尋找'www.bt.com',它不會匹配'http:// www.bt.com /' –

+0

@daogle查看更新部分,這將有助於您 – Girish

+0

隨着我發佈的答案,你的第一個建議工作得很好(雖然它需要6分鐘來運行查詢)。我確實嘗試過你的最後一個例子,但15分鐘後我停止了查詢 - 性能太差了!感謝您的幫助! –

0

所以,事實證明,我沒有通過地址列表過濾表A不夠好,並且看起來的URL的‘http’一度下滑通過 - 這意味着每個包含'http'的網址被發現...

所以我添加了另一個過濾器,檢查是否存在a。在URL中確保它至少爲something.something

if (strpos($domain, ".") !== false) { 
    // It has a .± 
} 
+0

使用if(strpos($ domain,'。')> = 0)來檢查是否存在,因爲如果找不到任何東西,strpos將返回-1(而不是false)。 – Yami

+0

@Yami雖然我認爲這將工作,[根據PHP文檔](http://php.net/manual/en/function.strpos.php)「strpos」似乎返回false(或者說,應該檢查就像我正在檢查) –

+0

是的,你是對的。我把它和.NET混合起來 – Yami