如何查询具有共享模式的所有记录

时间:2012-07-30 16:14:08

标签: mysql

我有一个包含网址的列。一些(但不是全部)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)) 
);

2 个答案:

答案 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个出现的域名。

<小时/>

编辑:

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

  • domain.co.uk
  • subdomain.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对结果进行分组,因为您可能有

  • example1.yahoo.com
  • example2.yahoo.com

但您可能还有

  • yahoo.com.br
  • google.com.br

答案 1 :(得分:0)

使用LIKE操作数。类似的东西:

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

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