Mysql
 sql >> Base de données >  >> RDS >> Mysql

Requête MySQL pour extraire les domaines des URL

J'ai dû combiner certaines des réponses précédentes, plus un peu plus de piratage pour mon ensemble de données. C'est ce qui fonctionne pour moi, il renvoie le domaine et tous les sous-domaines :

SUBSTRING_INDEX(SUBSTRING_INDEX(SUBSTRING_INDEX(SUBSTRING_INDEX(target_url, '/', 3), '://', -1), '/', 1), '?', 1) AS domain

Explication (car SQL non trivial a rarement du sens) :

SUBSTRING_INDEX(target_url, '/', 3) - supprime tout chemin si l'url a un protocole
SUBSTRING_INDEX(THAT, '://', -1) - supprime tout protocole de CELA
SUBSTRING_INDEX(THAT, '/', 1) - supprime tout chemin de CELA (s'il n'y avait pas de protocole)
SUBSTRING_INDEX(THAT, '?', 1) - supprime la chaîne de requête de CELA ( s'il n'y avait pas de chemin ou de / )

Scénarios de test :

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; 

Résultats :

'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'