2010-03-13 36 views
28

Tôi muốn có ý tưởng tốt hơn về những miền mà khách hàng của tôi đang sử dụng. Tôi có thể dễ dàng làm điều này trong PHP bằng cách explode ing từng địa chỉ và đếm tên miền theo cách đó. Nhưng tôi tự hỏi nếu có một cách để có được thông tin này chỉ với một truy vấn MySQL đơn giản?Truy vấn MySQL để đếm tên miền duy nhất từ ​​trường Địa chỉ email

Đây là những gì đầu ra mẫu sẽ trông như thế:

gmail.com | 3942

yahoo.com | 3852

hotmail.com | 209

... và như vậy, nơi cột đầu tiên là email địa chỉ tên miền, và cột thứ 2 là số lượng địa chỉ tại tên miền đó.

Trả lời

63

Bạn sẽ phải làm một cái gì đó như thế này:

SELECT substring_index(email, '@', -1) domain, COUNT(*) email_count 
FROM table 
GROUP BY substring_index(email, '@', -1) 

-- If you want to sort as well: 
ORDER BY email_count DESC, domain; 
+1

rất đẹp, cảm ơn! tôi thêm một loại trên số (*) và tôi nhận được chính xác kết quả tôi cần. – Ian

+0

Thật tuyệt vời! Cảm ơn! –

+0

Cảm ơn! đó là tôi đang tìm kiếm –

-1

Làm thế nào về một cái gì đó giống như

SELECT COUNT(DISTINCT [what you want]) 
FROM MyTable 

COUNT(DISTINCT expr,[expr...])

+0

tôi không chắc chắn những gì biểu hiện sẽ là để tách các phần của địa chỉ email vào người dùng và miền phần. – Ian

2

Thêm ORDER BY để trả lời WoLpH của làm cho đầu ra rõ ràng hơn:

SELECT substring_index(email, '@', -1), COUNT(*) AS MyCount 
FROM `database`.`table` 
GROUP BY substring_index(email, '@', -1) 
ORDER BY MyCount DESC; 
+1

Bạn đã bỏ lỡ câu trả lời của [WoLpH] (http://stackoverflow.com/a/2440458/104223)? Điều tương tự đã được đề xuất cách đây hai năm ;-) – Leigh

+0

Có. Tôi đã thêm ORDER BY MyCount DESC; Tôi có thể yêu thích để thêm nó vào của mình như là một commment nhưng chưa có 50 danh tiếng ... Tôi rõ ràng có thể đã làm điều này rõ ràng hơn trong câu trả lời của tôi. – Brad

+0

Vâng, giải thích có thể giúp ngăn chặn phiếu bầu. Btw, tôi đã không bỏ phiếu phản hồi của bạn vì nó đã hợp lệ. Tôi muốn họ sẽ thư giãn toàn bộ điều hạn chế 50 điểm .. vì nó thường xuyên tạo ra ngược lại với hiệu ứng mong muốn. Rất nhiều người làm chính xác những gì bạn đã làm. tức là đăng câu trả lời bởi vì họ không thể bình luận được. Bắt 22. – Leigh

0
select distinct SUBSTRING(Email, CHARINDEX('@', Email) + 1,LEN(Email) - CHARINDEX ('@', Email)), Count(*) from Tbl_name 
Group by SUBSTRING(Email, CHARINDEX('@', Email) + 1,LEN(Email) - CHARINDEX ('@', Email)) 
order by Count(*) desc 
0

Bạn có thể sử dụng truy vấn này để nhận số lượng Miền duy nhất từ ​​bảng.

SELECT substr(email,INSTR(email,"@")+1),count(substr(email,INSTR(email,"@"))) from YOUR_TABLE group by substr(email,INSTR(email,"@")); 
1

Chỉnh nhỏ thành bản gốc của Wolph ở trên để rút ngắn một chút và thêm tên cột đẹp và giới hạn kết quả trong danh sách trường hợp dài. Điều chỉnh giới hạn theo ý thích của riêng bạn

select substring_index(email, '@', -1) AS domain, count(*) from TABLE group by domain order by count(*) DESC limit 40; 
0
SELECT 
    substring_index(email_address, '@', -1) AS Domain 
    ,COUNT(*) AS MyCount 
FROM 
    database_name.table_name 
GROUP BY 
    substring_index(email_address, '@', -1) 
ORDER BY 
    MyCount DESC 
+0

Cảm ơn bạn đã chỉnh sửa mã của tôi @piaste –

+0

Bạn được chào đón :) – piaste

Các vấn đề liên quan