Tôi đã phải kết hợp một số câu trả lời trước đó, cộng thêm một chút hack cho tập dữ liệu của mình. Đây là những gì phù hợp với tôi, nó trả về miền và bất kỳ miền phụ nào:
SUBSTRING_INDEX(SUBSTRING_INDEX(SUBSTRING_INDEX(SUBSTRING_INDEX(target_url, '/', 3), '://', -1), '/', 1), '?', 1) AS domain
Giải thích (vì SQL không tầm thường hiếm khi có ý nghĩa):
SUBSTRING_INDEX(target_url, '/', 3)
- loại bỏ bất kỳ đường dẫn nào nếu url có giao thức
SUBSTRING_INDEX(THAT, '://', -1)
- loại bỏ bất kỳ giao thức nào khỏi THAT
SUBSTRING_INDEX(THAT, '/', 1)
- loại bỏ bất kỳ đường dẫn nào khỏi ĐÓ (nếu không có giao thức)
SUBSTRING_INDEX(THAT, '?', 1)
- loại bỏ chuỗi truy vấn khỏi ĐÓ (nếu không có đường dẫn hoặc dấu /)
Các trường hợp thử nghiệm:
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;
Kết quả:
'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'