webentwicklung-frage-antwort-db.com.de

zählen ohne Gruppe

Ich habe eine Tabelle namens GUYS (ID, NAME, PHONE), und ich muss hinzufügen, wie viele Leute den gleichen Namen haben und gleichzeitig alle anzeigen, sodass ich sie nicht gruppieren kann.

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

die gewünschte Ausgabe sollte sein

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 kann ich das machen? Ich schaffe es nur, viele Leute mit unterschiedlichen Zahlen zu bekommen.

vielen Dank

20
east

Da MySQL keine analytischen Funktionen wie Oracle hat, müssen Sie auf eine Unterabfrage zugreifen.

Verwenden Sie nicht GROUP BY, sondern eine Unterauswahl, um die Anzahl der Typen mit demselben 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

Sie würden denken, dass die Ausführung einer Unterauswahl für jede Zeile langsam ist. Wenn Sie jedoch über geeignete Indizes verfügen, optimiert MySQL diese Abfrage und Sie werden feststellen, dass sie einwandfrei läuft. 

In diesem Beispiel sollten Sie einen Index für Guys.name haben. Wenn in der where-Klausel der Unterabfrage mehrere Spalten vorhanden sind, würde die Abfrage wahrscheinlich von einem einzigen kombinierten Index für alle diese Spalten profitieren.

22
GolezTrol

Verwenden Sie eine Aggregatabfrage:

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

Sie können weiterhin einen GROUP BY für die Zählung verwenden. Sie müssen lediglich JOIN in Ihre ursprüngliche Tabelle zurücksetzen, um alle Datensätze wie folgt abzurufen:

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
10
RedFilter

In Oracle DB können Sie verwenden

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

0
Sayantan Dey
select id, name, phone,(select count(name) from users u1 where u1.name=u2.name) count from users u2
0
redoc