我正在尝试在mysql数据库上做一个简单的select语句。在MsSql中它工作正常,但我不能让它在MySql中工作。
我想做的是以下内容:
假设我有一个像这样的表(名为TestTable):
ID | DOMAIN | NrOfVisitors
--------------------------------------------
1 | something.com | 435
--------------------------------------------
2 | blabla.com | 231
我有一个字符串,如http://bla.ttt.something.com/blabla
现在我想传入字符串,然后选择域在字符串中的行。 在MsSQL中,我可以执行以下操作:
SELECT *
FROM TestTable
WHERE "http://bla.ttt.something.com/blabla" LIKE "%" DOMAIN "%"
但在MySql中它返回0
行。我做错了什么?
提前致谢!
答案 0 :(得分:3)
SELECT * FROM TestTable WHERE "http://bla.ttt.something.com/blabla" LIKE CONCAT("%",DOMAIN,"%")
答案 1 :(得分:2)
好吧,强大解决方案的第一步是从字符串中提取域名(使用parse_url
):
$string = 'http://bla.ttt.something.com/blabla';
$domain = parse_url($string, PHP_URL_HOST);
然后,假设您只想匹配域的前两个级别(something.com
),则需要从域中提取...
$parts = explode('.', $domain);
$top2parts = array_slice($parts, -2);
$rootDomain = implode('.', $top2parts);
然后,我们构建查询:
$sql = "SELECT *
FROM TestTable
WHERE domain LIKE '%".mysql_real_escape_string($rootDomain)."%'";
那应该为你做。对于给定的输入,它将生成:
SELECT *
FROM TestTable
WHERE domain LIKE '%something.com%'
当然,您可以通过其他方式执行此操作,并通过将通配符与域名进行搜索来搜索:
SELECT *
FROM TestTable
WHERE CONCAT('%', domain, '%') LIKE 'http://bla.ttt.something.com/blabla'
但问题网址显示的问题是:http://foo.bar/blah/something.com.html
...这会为something.com
返回误报,因为它在网址中,但它不在域中...因此,避免这种情况(同时仍在搜索完整域名)的一种方法是进行组合:
$string = 'http://bla.ttt.something.com/blabla';
$domain = parse_url($string, PHP_URL_HOST);
$sql = "SELECT *
FROM TestTable
WHERE CONCAT('%', domain, '%') LIKE '".mysql_real_escape_string($domain)."'";
对于这种情况将产生:
SELECT *
FROM TestTable
WHERE CONCAT('%', domain, '%') LIKE 'bla.ttt.something.com'