以前の回答のいくつかに加えて、データセットにもう少しハッカーを組み合わせる必要がありました。これは私にとってうまくいくものであり、ドメインとすべてのサブドメインを返します:
SUBSTRING_INDEX(SUBSTRING_INDEX(SUBSTRING_INDEX(SUBSTRING_INDEX(target_url, '/', 3), '://', -1), '/', 1), '?', 1) AS domain
説明(重要なSQLが意味をなさない原因となることはめったにありません):
SUBSTRING_INDEX(target_url, '/', 3)
-URLにプロトコルがある場合は、すべてのパスを削除します
SUBSTRING_INDEX(THAT, '://', -1)
-THATからすべてのプロトコルを削除しますSUBSTRING_INDEX(THAT, '/', 1)
-THATからすべてのパスを削除します(プロトコルがなかった場合)
SUBSTRING_INDEX(THAT, '?', 1)
-クエリ文字列をその文字列から削除します(パスまたは末尾の/がない場合)
テストケース:
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;
結果:
'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'