2010-03-13 16 views
28

Me gustaría tener una mejor idea de qué dominios están utilizando mis clientes. Podría hacer esto fácilmente en PHP por explode cada dirección y contando el dominio de esa manera. Pero me pregunto si hay una forma de obtener esta información con solo una simple consulta de MySQL.Consulta de MySQL para contar dominios exclusivos desde el campo Dirección de correo electrónico

Esto es lo que muestra la producción se vería así:

gmail.com | 3942

yahoo.com | 3852

hotmail.com | 209

... y así sucesivamente, en donde la primera columna es el correo electrónico direcciones de dominio, y la segunda columna es el número de direcciones en ese dominio.

Respuesta

63

Usted tendría que hacer algo como esto:

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

muy agradable, gracias! Agregué un tipo en el conteo (*) y obtuve exactamente los resultados que necesito. – Ian

+0

¡Eso es increíble! ¡Gracias! –

+0

Gracias! eso estaba buscando –

-1

¿Qué tal algo así como

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

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

+0

no estoy seguro de lo que sería la expresión para separar las partes de la dirección de correo electrónico en porciones usuario y el dominio. – Ian

2

Adición de ORDER BY a la respuesta de WoLpH hace que la salida más claro:

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

¿Echas de menos [respuesta de WoLpH] (http://stackoverflow.com/a/2440458/104223)? Lo mismo fue sugerido hace dos años ;-) – Leigh

+0

Sí. Agregué ORDER BY MyCount DESC; Me hubiera encantado agregarlo a él como un comentario, pero aún no tengo 50 reputación ... Obviamente podría haber dejado esto más claro en mi respuesta. – Brad

+0

Sí, una explicación podría ayudar a evitar los votos. Por cierto, no voté por su respuesta porque era válida. Desearía que relajaran todo el asunto de restricción de 50 puntos ... ya que con frecuencia produce el efecto contrario al deseado. Mucha gente hace exactamente lo que hiciste. es decir, publicar respuestas porque aún no pueden comentar. 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

Puede usar esta consulta para obtener el recuento único de dominio de la tabla.

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

pequeño pellizco a Wolph de origen encima de acortar un poco y añadir agradables nombre de columna y limitar los resultados en la lista de casos es larga. Ajuste límite a su propio gusto

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

Gracias por editar mi código @piaste –

+0

De nada :) – piaste

Cuestiones relacionadas