2009-08-11 26 views
13

quiero tirar de los resultados y contar el número de cada nombre se tira, pero sin agrupar ...MySQL: ¿cuenta las entradas sin agrupar?

por ejemplo, quiero esto:

John Doe 3 
John Doe 3 
John Doe 3 
Mary Jane 2 
Mary Jane 2 

en lugar de esto:

John Doe 3 
Mary Jane 2 

¿Tiene sentido?

Gracias.

+1

¿Cuál es la razón para no hacerlo por un grupo? Puede obtener el resultado que desea uniendo su tabla original con un grupo por consulta en esa tabla. – pjp

+1

pjp - No creo que haya tenido problemas con el uso de un 'GROUP BY', simplemente no quería agrupar el resultado final. –

+0

Sí LuckyLindy es correcto. –

Respuesta

10
SELECT b.name, a.the_count 
FROM 
    some_table b, 
    (SELECT name, COUNT(*) AS the_count 
    FROM some_table 
    GROUP BY name) AS a 
WHERE b.name = a.name 
+0

Igual que mi respuesta, pero prefiero mi nombre de tabla :) – pjp

+1

jaja, sí ... some_table y A/B no son muy descriptivos;) –

2
SELECT mo.*, 
     (
     SELECT COUNT(*) 
     FROM mytable mi 
     WHERE mi.name = mo.name 
     ) 
FROM mytable mo 
+0

'Select mo. *, ( SELECT COUNT (*) DE mitabla mi DONDE mi.name = mo.name y 1 = 1 y 2 = 2 y 3 = 3 ) de Mo mitabla DONDE mi.name = mo.name y 1 = 1 y 2 = 2 y 3 = 3' viola DRY. ¿Cómo podemos hacer esto sin tener que repetir la cláusula 'where'? – Pacerier

+0

@Pacerier: crea una tabla temporal y escribe los resultados allí primero. En otros sistemas podríamos escribir un CTE, pero MySQL no los admite. – Quassnoi

+0

¿Son las tablas temporales una buena solución? ¿No deberíamos usar cursores? – Pacerier

0
SELECT `name`, 
    (
     SELECT COUNT(*) 
     FROM `table` AS `alt` 
     WHERE `alt`.`name` = `table`.`name` 
    ) AS `num` 
FROM `table` 
2

Si no desea utilizar una subconsulta, también puede unirse a la mesa a sí mismo de esta manera: que requeriría una subconsulta. Tal vez algo como esto:

SELECT t1.name, COUNT(t2.name) 
FROM my_table AS t1 
INNER JOIN my_table AS t2 ON (t1.primary_key_field = t2.primary_key_field) 
WHERE some_conditions 
GROUP BY t1.name 
2

Este utiliza group by pero se pone la salida en el formato que desee.

SELECT Name, NG.NameCount 
FROM Names 
INNER JOIN 
    (SELECT Name, Count(1) As NameCount 
    FROM Names 
    GROUP BY Name) NG 
ON Names.Name = NG.Name