0

我有一列包含网址。一些(但不是全部)网址共享同一个域。例如:aaa.yahoo.com、bbb.yahoo.com、ccc.yahoo.com。这些 url 存储在一个唯一的字段中。此外,同一个表有一个自增主键。

我需要做的和需要帮助的是:查询所有共享相同域名的url。请注意,我没有可以在查询中输入的确切域名,数据库中有很多可用的共享域名,我想全部查询。

编辑: 这是我尝试过的命令,但完全不确定,因为我在 SQL 方面没有太多经验:

SELECT domainname FROM DB.TABLE
WHERE SUBSTRING(domainname, LOCATE('.', domainname))
IN(
    SELECT   domainname
    FROM     DB.TABLE
    GROUP BY SUBSTRING(domainname, LOCATE('.', doaminname)) 
);
4

2 回答 2

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 次的域。


编辑:

代表您的评论发言...因为您无法知道以下示例中的域(除非您根据大量国家代码、域扩展名等测试值)

  • 域名.co.uk
  • 子域.domain.co

您无法以编程方式检测到这些。如果您打算依靠扩展名或国家/地区扩展名,那也行不通。您可以做的是进行智能分类并通过您的眼睛挑选那些,除非您采用上述解决方案。

所以,例如,

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`

可能会帮助你看到它。请注意,您不能将结果分组f2f3因为您可能有

  • 示例1.yahoo.com
  • example2.yahoo.com

但你可能也有

  • 雅虎网
  • google.com.br
于 2012-07-30T17:46:04.727 回答
0

使用 LIKE 操作数。就像是:

SELECT domainname from DB.TABLE where domainname LIKE '%.yahoo.com';

它将返回 yahoo.com 的所有子域。'%' 是多个字符的通配符,使用下划线 '_' 表示单个字符。

于 2012-07-30T17:20:42.460 回答