2010-11-23 10 views
16

Ich habe eine Tabelle namens GUYS (ID, NAME, Telefon) und ich muss hinzufügen, wie viele Leute den gleichen Namen haben und gleichzeitig alle von ihnen zeigen, damit ich sie nicht gruppieren kann . Beispiel:zählen ohne Gruppe

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

die gewünschte Ausgabe

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

wie könnte ich das tun sollte? Ich schaffe es nur, viele Leute mit unterschiedlichen Zahlen zu bekommen.

dank

Antwort

10

Sie noch einen GROUP BY für die Zählung verwenden können, die Sie JOIN es zu Ihrem ursprünglichen Tabelle müssen nur wieder alle Datensätze zu erhalten, wie folgt aus:

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

Da MySQL ‚doesn t haben analytical functions like Oracle, müssen Sie auf eine Unterabfrage zurückgreifen.

nicht GROUP BY Sie verwenden möchten, verwenden Sie eine Unter wählen die Anzahl der Männer mit dem gleichen Namen zu zählen:

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

Man sollte meinen, das wäre eine Unterauswahl für jede Zeile läuft langsam, aber wenn Sie richtige Indizes haben, wird MySQL diese Abfrage optimieren und Sie werden sehen, dass es gut läuft. In diesem Beispiel sollten Sie einen Index auf Guys.name haben. Wenn Sie mehrere Spalten in der where-Klausel der Unterabfrage haben, würde die Abfrage wahrscheinlich von einem einzigen kombinierten Index für alle diese Spalten profitieren.

+1

ich diese Abfrage erwartet langsamer ab als Antwort der Rotfilter, aber das war nicht der Fall in meinem Test . Mit einer Million Zeilen-Datenbank war es in weniger als der Hälfte der Zeit erledigt. Ich habe 'Name' indiziert. – Tony

+0

Gern geschehen. :) – GolezTrol

13

Verwenden Sie ein Aggregat Abfrage:

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

'COUNT ... OVER (...)' ist keine MySQL-Syntax und diese Frage ist mit MySQL getaggt. –

+2

Obwohl dies nicht für MySQL ist, ist dies eine viel bessere Lösung für Oracle-Leute. Danke Sowmia! – asgs

+0

funktioniert für mssql auch +1! –

0

In Oracle DB können Sie

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

Verwandte Themen