2010-03-13 3 views
28

Ich möchte eine bessere Vorstellung davon bekommen, welche Domains meine Kunden verwenden. Ich könnte dies einfach in PHP durch explode in jeder Adresse tun und die Domain so zählen. Aber ich frage mich, ob es eine Möglichkeit gibt, diese Informationen nur mit einer einfachen MySQL-Abfrage zu erhalten.MySQL Query zum Zählen eindeutiger Domains aus dem Feld E-Mail-Adresse

Dies ist, was Beispielausgabe aussehen würde:

gmail.com | 3942

yahoo.com | 3852

hotmail.com | 209

... und so weiter, wobei die erste Spalte die E-Mail-Adressen-Domäne ist, und Die zweite Spalte ist die Anzahl der Adressen in dieser Domäne.

Antwort

63

würden Sie haben, so etwas zu tun:

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

sehr schön, danke! Ich habe eine Sortierung hinzugefügt (*) und bekomme genau die Ergebnisse, die ich brauche. – Ian

+0

Das ist großartig! Vielen Dank! –

+0

Danke! das war ich suche –

-1

Wie wäre es so etwas wie

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

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

+0

Ich bin nicht sicher, was der Ausdruck, die Teile der E-Mail-Adresse in Benutzer- und Domänenabschnitte zu trennen wäre. – Ian

2

ORDER Hinzufügen BY Antwort auf Wolph macht, die Ausgabe mehr klar:

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

Haben Sie [WoLpHs Antwort] vermisst (http://stackoverflow.com/a/2440458/104223)? Das gleiche wurde vor zwei Jahren vorgeschlagen ;-) – Leigh

+0

Ja. Ich habe ORDER BY MyCount DESC hinzugefügt; Ich hätte es liebend gerne als Comment hinzugefügt, aber habe noch keinen Ruf ... Ich hätte das natürlich in meiner Antwort deutlicher machen können. – Brad

+0

Ja, eine Erklärung könnte helfen, die Stimmen abzuwehren. Übrigens, ich habe Ihre Antwort nicht abgelehnt, da sie gültig war. Ich wünschte, sie würden die ganze 50-Punkte-Einschränkungs-Sache entspannen, da sie häufig das Gegenteil des gewünschten Effekts erzeugt. Viele Leute tun genau das, was du getan hast. dh Post Antworten, weil sie noch nicht kommentieren können. 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

Sie können diese Abfrage verwenden, um Unique count of domain from table zu erhalten.

1

Kleine Tweak zu Wolphs Original oben, um ein bisschen zu verkürzen und fügen Sie schöne Spaltennamen und Limit Ergebnisse in Fall Liste ist lang. Passen Grenze nach Ihrem eigenen Wünschen

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

Danke für die Bearbeitung meines Codes @piaste –

+0

Gern geschehen :) – piaste