MySQL精确的URL搜索

时间:2015-01-07 11:07:12

标签: php mysql url

所以我试图合并两个公司信息数据库(表A和表B从这里开始),其中最常见(和可靠)的单一参考点是网站URL。表A是最新的,表B将更新。

我从表A中提取了URL并使用PHP(大约6000个URL)对其进行了清理,计划是根据找到的URL(但不是URL本身)查找和更新表B中的一些信息。

在表A中,网址均为domain.comwww.domain.comwww.subdomain.domain.com,不含http://或任何尾随/或其他网址数据。在表B中,它们是原始URL,可能包含任何额外信息,例如http:// etc。

现在我尝试通过表B中的URL搜索公司,如下所示:

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中并非所有表A都在表B中)。

2 个答案:

答案 0 :(得分:0)

LIKE不会返回精确搜索但您可以使用MySql REGEXP进行精确搜索,它会在搜索字段中找到确切的结果并仅返回精确的网址

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

或者,如果归档只有单个网址,则可以使用=运算符

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

<强>更新 在此,您可以花费REGEX serarch并仅输入SERVER_NAME,例如domain.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)$'

答案 1 :(得分:0)

事实证明,我没有在表A中的地址列表中过滤得足够好,并且看起来“http”的网址已经滑过 - 这意味着每个包含“http”的网址都是被发现......

所以我添加了另一个检查是否存在的过滤器。在URL中,确保它至少为something.something

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