我有一个包含网址的列。一些(但不是全部)URL共享相同的域。例如:aaa.yahoo.com,bbb.yahoo.com,ccc.yahoo.com。这些网址存储在一个唯一的字段中。此外,同一个表具有自动增量主键。
我需要做的是需要帮助:查询所有共享相同域名的网址。请注意,我没有确切的域名可以放在查询中,数据库中有很多可用的共享域名,我想查询它们。
修改 这是我尝试的命令,但完全不确定,因为我没有那么多的SQL经验:
SELECT domainname FROM DB.TABLE
WHERE SUBSTRING(domainname, LOCATE('.', domainname))
IN(
SELECT domainname
FROM DB.TABLE
GROUP BY SUBSTRING(domainname, LOCATE('.', doaminname))
);
答案 0 :(得分:1)
如果我不正确地理解你......
SELECT
COUNT(`domainname`) AS 'occ'
,SUBSTRING(`domainname`,LOCATE('.',`domainname`)+1) AS 'domain'
FROM `the_table`
GROUP BY SUBSTRING(`domainname`,LOCATE('.',`domainname`)+1)
HAVING `occ`>1
ORDER BY `occ` DESC,`domain` ASC
HAVING...
行将过滤掉表格中只有1个出现的域名。
<小时/>
代表您的意见发言...因为您无法知道以下示例中的域名(除非您根据大量国家/地区代码,域名扩展等测试值)
您无法以编程方式检测到这些内容。如果您计划依赖分机或国家/地区扩展,那也无济于事。你可以做的就是做一个聪明的分类并用你的眼睛挑选,除非你去做上面提到的解决方案。
所以,例如,
SELECT
`id`
,`d` AS 'domain'
,IF(CHAR_LENGTH(`d`)-CHAR_LENGTH(REPLACE(`d`,'.',''))=2,
SUBSTRING_INDEX(`d`,'.',1),'') AS 'f1'
,SUBSTRING_INDEX(SUBSTRING_INDEX(`d`,'.',-2),'.',1) AS 'f2'
,SUBSTRING_INDEX(`d`,'.',-1) AS 'f3'
FROM (
SELECT
`id`
,IF(CHAR_LENGTH(`domainname`)-CHAR_LENGTH(REPLACE(`domainname`,'.',''))>2,
SUBSTRING_INDEX(`domainname`,'.',-3),`domainname`) AS 'd'
FROM `the_table`
GROUP BY `d`
) t
ORDER BY `f3`,`f2`,`f1`
可能会帮助您查看它。请注意,您无法按f2
和f3
对结果进行分组,因为您可能有
但您可能还有
答案 1 :(得分:0)
使用LIKE操作数。类似的东西:
SELECT domainname from DB.TABLE where domainname LIKE '%.yahoo.com';
它将返回yahoo.com的所有子域。 '%'是多个字符的通配符,对单个字符使用下划线'_'。