使用MySQL从URL到组获取域

使用MySQL从URL到组获取域,mysql,Mysql,我有一个充满URL的表格。URL有各种格式:,,等等。但我只对域名本身感兴趣,所以在本例中:foo.com。我想做的是选择这个表中域名存在的次数。比如: SELECT "whatever the domain is in field 'url'", COUNT(*) AS count FROM table_with_urls GROUP BY "whatever the domain is in field 'url'" 关于堆栈溢出,也有一些类似的问题,但没有什么真正的答案。我不能使用LIKE

我有一个充满URL的表格。URL有各种格式:,,等等。但我只对域名本身感兴趣,所以在本例中:foo.com。我想做的是选择这个表中域名存在的次数。比如:

SELECT "whatever the domain is in field 'url'", COUNT(*) AS count
FROM table_with_urls
GROUP BY "whatever the domain is in field 'url'"
关于堆栈溢出,也有一些类似的问题,但没有什么真正的答案。我不能使用LIKE或与REGEXP匹配,因为我并不(总是)寻找要匹配的特定域名,但主要是我想要表中的所有域名以及总数


使用MySQL是否可以这样做?

为“域”添加另一个索引列,并且在执行插入操作时,单独存储此值。

我遇到了相同的问题,我就是这样做的:

select SUBSTRING(url from 1 for locate('/',url ,10)-1),count(*) from url_list group by SUBSTRING(url from 1 for locate('/',url ,10)-1);

如果您想安装MySQL扩展,那么

它基本上提取了你所期望的内容

select`get_etld_p1`('http://a.very.complex-domain.co.uk:8080/foo/bar');-- 'complex-domain.co.uk'
select`get_etld_p1`('https://www.bbc.co.uk/');-- 'bbc.co.uk'
select`get_etld_p1`('https://github.com/StirlingMarketingGroup/');-- 'github.com'
select`get_etld_p1`('https://localhost:10000/index');-- 'localhost'
select`get_etld_p1`('android-app://com.google.android.gm');-- 'com.google.android.gm'
select`get_etld_p1`('example.test.domain.com');-- 'domain.com'
select`get_etld_p1`('postgres://user:pass@host.com:5432/path?k=v#f');-- 'host.com'
select`get_etld_p1`('exzvk.omsk.so-ups.ru');-- 'so-ups.ru'
select`get_etld_p1`('http://10.64.3.5/data_check/index.php?r=index/rawdatacheck');-- '10.64.3.5'
select`get_etld_p1`('not a domain');-- null
然后,如果您想让它运行,您可以创建第二个非规范化列,只存储这些值,比如

CREATE TABLE `db`.`sometablewithurls` (
  `SomeTableWithURLsID` INT UNSIGNED NOT NULL AUTO_INCREMENT,
  `URL` TEXT NOT NULL DEFAULT '',
  `_ETLDP1` VARCHAR(255) NOT NULL DEFAULT '',
  PRIMARY KEY (`SomeTableWithURLsID`),
  INDEX `_ETLDP1` (`_ETLDP1` ASC));
DROP TRIGGER IF EXISTS `db`.`sometablewithurls_BEFORE_INSERT`;

DELIMITER $$
USE `db`$$
CREATE DEFINER = CURRENT_USER TRIGGER `db`.`sometablewithurls_BEFORE_INSERT` BEFORE INSERT ON `sometablewithurls` FOR EACH ROW
BEGIN

set new.`_ETLDP1`=ifnull(`get_etld_p1`(new.`URL`),'');

END$$
DELIMITER ;
DROP TRIGGER IF EXISTS `db`.`sometablewithurls_BEFORE_UPDATE`;

DELIMITER $$
USE `db`$$
CREATE DEFINER = CURRENT_USER TRIGGER `db`.`sometablewithurls_BEFORE_UPDATE` BEFORE UPDATE ON `sometablewithurls` FOR EACH ROW
BEGIN

set new.`_ETLDP1`=ifnull(`get_etld_p1`(new.`URL`),'');

END$$
DELIMITER ;

请注意
\u ETLDP1
上的索引(代表扩展的顶级域加1),以及在插入和更新时更新它的触发器,以确保即使URL发生更改,它也能保持最新。

很难定义“域名”,因为您有“foo.co.uk”、“mydomain.myhost.com”、“foo.museum”等内容,唯一准确的方法是列出可能的顶级域,这个列表相当长(100个元素)。在你的上下文中,你能更具体地解释一下“域名”是什么意思吗?在1:[子域]2:[foo.com/foo.co.uk]3:[/随便什么]中只查找2个。但我担心它会与所有可能的TLD等匹配。