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
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.
Verwenden Sie eine Aggregatabfrage:
select g.ID, g.Name, g.Phone, count(*) over ( partition by g.name ) as Count
from
Guys g;
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
In Oracle DB können Sie verwenden
SELECT ID,NAME,PHONE,(Select COUNT(ID)From GUYS GROUP BY Name)
FROM GUYS ;
select id, name, phone,(select count(name) from users u1 where u1.name=u2.name) count from users u2