2009-08-11 9 views
13

voglio tirare risultati e contare quante di ogni nome è tirato ma senza raggruppamento ...MySQL: conta le voci senza raggruppamento?

per esempio io voglio questo:

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

invece di questo:

John Doe 3 
Mary Jane 2 

Ha senso?

Grazie.

+1

Qual è la ragione per non fare un gruppo? Puoi ottenere l'output desiderato unendoti alla tua tabella originale con un gruppo per query su quel tavolo. – pjp

+1

pjp - Non penso che abbia avuto problemi nell'usare un 'GROUP BY', non voleva che l'output finale fosse raggruppato. –

+0

Sì LuckyLindy è corretto. –

risposta

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

Uguale la mia risposta - ma io preferisco la mia tabella di denominazione :) – pjp

+1

haha, sì ... some_table e A/B non sono molto descrittivo;) –

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

'SELEZIONARE mo. *, ( SELECT COUNT (*) FROM tabella mi DOVE mi.name = mo.name e 1 = 1 e 2 = 2 e 3 = 3 ) da Mo mytable DOVE mi.name = mo.name e 1 = 1 e 2 = 2 e 3 = 3' viola DRY. Come possiamo farlo senza dover ripetere la clausola 'where'? – Pacerier

+0

@Pacerier: crea una tabella temporanea e scrivi i risultati per primi. In altri sistemi potremmo scrivere un CTE, ma MySQL non li supporta. – Quassnoi

+0

Le tabelle temporanee sono una buona soluzione? Non dovremmo usare i cursori? – Pacerier

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

Se non si desidera utilizzare un subquery, si può anche partecipare al tavolo a se stesso in questo modo: che richiederebbero una subquery. Forse qualcosa di simile:

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

Questo utilizza group by ma ottiene l'output nel formato che si desidera.

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 
Problemi correlati