2010-03-13 9 views
28

Chciałbym uzyskać lepsze informacje o domenach używanych przez moich klientów. Mogę łatwo to zrobić w PHP przez explode przy każdym adresie i licząc domenę w ten sposób. Ale zastanawiam się, czy istnieje sposób, aby uzyskać te informacje za pomocą zwykłego zapytania MySQL?Kwerenda MySQL do liczenia unikatowych domen z pola Adres e-mail

To właśnie wyjście próbki wyglądałby następująco:

gmail.com | 3942

yahoo.com | 3852

hotmail.com | 209

... i tak dalej, gdzie pierwsza kolumna jest adresy e-mail domenę, a druga kolumna to liczba adresów w tej domenie.

Odpowiedz

63

Trzeba by zrobić coś takiego:

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

bardzo ładne, dzięki! dodałem sortowanie na liczniku (*) i otrzymuję dokładnie takie wyniki, jakich potrzebuję. – Ian

+0

To jest niesamowite! Dzięki! –

+0

Dzięki! to szukałem –

-1

Jak o czymś takim

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

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

+0

nie jestem pewien, co wyrażenie byłoby oddzielenie części adresu e-mail do użytkownika i domena porcjach. – Ian

2

Dodawanie ORDER BY, żeby odpowiedź WoLpH sprawia wyjście bardziej jasne:

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

Tęskniłeś za [Odpowiedź WoLpH'a] (http://stackoverflow.com/a/2440458/104223)? To samo zasugerowano dwa lata temu ;-) – Leigh

+0

Tak. Dodałem ORDER BY MyCount DESC; Chciałbym dodać to do niego jako dodatek, ale nie mam jeszcze 50 reputacji ... Oczywiście mogłem to wyjaśnić w mojej odpowiedzi. – Brad

+0

Tak, wyjaśnienie może pomóc w powstrzymaniu głosów. Przy okazji nie głosowałem na twoją odpowiedź, ponieważ była ona ważna. Żałuję, że nie rozluźnią całego 50-punktowego ograniczenia, ponieważ często wywołuje to przeciwieństwo pożądanego efektu. Wiele osób robi dokładnie to, co zrobiłeś. tj. wysyłać odpowiedzi, ponieważ nie mogą jeszcze komentować. Catch 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

Możesz użyć tego zapytania, aby uzyskać unikalną liczbę domen z tabeli.

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

Mały uszczypnąć do Wolph na oryginalny powyżej skrócić trochę i dodać ładne imię kolumny i ograniczyć wyniki w Wokanda jest długa. Regulacja limitu do własnych upodobań

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

Dziękujemy za edycję mojego kodu @piaste –

+0

Nie ma za co :) – piaste