sql >> Databáze >  >> RDS >> Mysql

Dotaz Mysql pro extrahování domén z adres URL

Musel jsem zkombinovat některé z předchozích odpovědí plus trochu více hackerských útoků pro můj soubor dat. To je to, co mi funguje, vrací doménu a všechny subdomény:

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

Vysvětlení (protože netriviální SQL má smysl jen zřídka):

SUBSTRING_INDEX(target_url, '/', 3) - odstraní jakoukoli cestu, pokud má adresa URL protokol
SUBSTRING_INDEX(THAT, '://', -1) - odebere jakýkoli protokol z THAT
SUBSTRING_INDEX(THAT, '/', 1) - odebere libovolnou cestu z THAT (pokud neexistoval žádný protokol)
SUBSTRING_INDEX(THAT, '?', 1) - odebere řetězec dotazu z THAT (pokud tam nebyla žádná cesta nebo koncová / )

Testovací případy:

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; 

Výsledky:

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


  1. Porovnávací algoritmus v SQL

  2. Jak mohu kombinovat AND a OR v mém příkazu SQL

  3. MySQL UNION doložka

  4. CakePHP Databázové připojení Mysql chybí nebo se nepodařilo vytvořit