Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Consulta Mysql para extrair domínios de urls


Eu tive que combinar algumas das respostas anteriores, além de um pouco mais de hackers para o meu conjunto de dados. Isso é o que funciona para mim, ele retorna o domínio e quaisquer subdomínios:
SUBSTRING_INDEX(SUBSTRING_INDEX(SUBSTRING_INDEX(SUBSTRING_INDEX(target_url, '/', 3), '://', -1), '/', 1), '?', 1) AS domain

Explicação (porque SQL não trivial raramente faz sentido):

SUBSTRING_INDEX(target_url, '/', 3) - remove qualquer caminho se o URL tiver um protocolo
SUBSTRING_INDEX(THAT, '://', -1) - remove qualquer protocolo DESSE
SUBSTRING_INDEX(THAT, '/', 1) - remove qualquer caminho DESSE (se não houver protocolo)
SUBSTRING_INDEX(THAT, '?', 1) - retira a string de consulta DE QUE (se não houver caminho ou / à direita)

Casos de teste:
SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(SUBSTRING_INDEX(SUBSTRING_INDEX(target_url, '/', 3), '://', -1), '/', 1), '?', 1) AS domain
FROM ( 
    SELECT       'http://test.com' as target_url 
    UNION SELECT 'https://test.com' 
    UNION SELECT 'http://test.com/one' 
    UNION SELECT 'http://test.com/?huh' 
    UNION SELECT 'http://test.com?http://ouch.foo' 
    UNION SELECT 'test.com' 
    UNION SELECT 'test.com/one'
    UNION SELECT 'test.com/one/two'
    UNION SELECT 'test.com/one/two/three'
    UNION SELECT 'test.com/one/two/three?u=http://maaaaannn'
    UNION SELECT 'http://one.test.com'
    UNION SELECT 'one.test.com/one'
    UNION SELECT 'two.one.test.com/one' ) AS Test; 

Resultados:
'test.com'
'test.com'
'test.com'
'test.com'
'test.com'
'test.com'
'test.com'
'test.com'
'test.com'
'test.com'
'one.test.com'
'one.test.com'
'two.one.test.com'