2010-11-23 11 views
16

Tengo una tabla llamada GUYS (ID, NOMBRE, TELÉFONO) y necesito agregar un recuento de cuántos chicos tienen el mismo nombre y al mismo tiempo mostrarlos todos para que no pueda agruparlos . ejemplo:cuenta sin grupo

ID NAME PHONE 
1 John 335 
2 Harry 444 
3 James 367 
4 John 742 
5 John 654 

la salida deseada debe ser

ID NAME PHONE COUNT 
1 John 335 3 
2 Harry 444 1 
3 James 367 1 
4 John 742 3 
5 John 654 3 

¿Cómo podría hacerlo? solo logro obtener muchos tipos con diferentes conteos.

gracias

Respuesta

10

puede seguir utilizando un GROUP BY para el recuento, sólo tiene que JOIN de nuevo a su mesa original para obtener todos los registros, así:

select g.ID, g.Name, g.Phone, gc.Count 
from Guys g 
inner join (
    select Name, count(*) as Count 
    from Guys 
    group by Name 
) gc on g.Name = gc.Name 
21

Desde MySQL doesn' t tiene analytical functions like Oracle, tendrá que recurrir a una sub consulta.

No utilice GROUP BY, utilizar un sub-select para contar el número de chicos con el mismo nombre:

SELECT 
    t.name, 
    t.phone, 
    (SELECT COUNT('x') FROM Guys ct 
    WHERE ct.name = t.name) as namecounter 
FROM 
    Guys t 

Se podría pensar que la ejecución de un sub-select para cada fila sería lento, pero si tienes los índices adecuados, MySQL optimizará esta consulta y verás que funciona correctamente. En este ejemplo, debe tener un índice en Guys.name. Si tiene varias columnas en la cláusula where de la subconsulta, la consulta probablemente se beneficie de un único índice combinado en todas las columnas.

+1

que esperaba esta consulta para realizar más lenta que la respuesta de redfilter, pero eso no fue el caso en mis pruebas . Con una base de datos de millones de filas, se completó en menos de la mitad del tiempo. Tengo 'nombre' indexado. – Tony

+0

De nada. :) – GolezTrol

13

utilizar una consulta agregada:

select g.ID, g.Name, g.Phone, count(*) over (partition by g.name) as Count 
from 
Guys g; 
+3

'COUNT ... OVER (...)' no es la sintaxis de MySQL, y esta pregunta está etiquetada como MySQL. –

+2

Aunque esto no es para MySQL, esta es una solución mucho mejor para la gente de Oracle. Gracias Sowmia! – asgs

+0

funciona también para mssql +1! –

0

En Oracle DB puede utilizar

SELECT ID,NAME,PHONE,(Select COUNT(ID)From GUYS GROUP BY Name) FROM GUYS ;

Cuestiones relacionadas