J'ai une table nommée GUYS (ID, NOM, TÉLÉPHONE) et je dois ajouter le nombre de mecs portant le même nom et les montrer tous en même temps pour que je ne puisse pas les regrouper ..__
ID NAME PHONE
1 John 335
2 Harry 444
3 James 367
4 John 742
5 John 654
la sortie recherchée devrait être
ID NAME PHONE COUNT
1 John 335 3
2 Harry 444 1
3 James 367 1
4 John 742 3
5 John 654 3
comment pourrais-je faire ça? Je n'arrive qu'à avoir beaucoup de gars avec des comptes différents.
merci
Comme MySQL n’a pas de fonctions analytiques comme Oracle , vous devrez recourir à une sous-requête.
N'utilisez pas GROUP BY
, utilisez une sous-sélection pour compter le nombre de gars ayant le même nom:
SELECT
t.name,
t.phone,
(SELECT COUNT('x') FROM Guys ct
WHERE ct.name = t.name) as namecounter
FROM
Guys t
On pourrait penser que faire une sous-sélection pour chaque ligne serait lent, mais si vous avez les bons index, MySQL optimisera cette requête et vous verrez qu'elle fonctionne parfaitement.
Dans cet exemple, vous devriez avoir un index sur Guys.name
. Si vous avez plusieurs colonnes dans la clause where
de la sous-requête, la requête bénéficierait probablement d'un seul index combiné sur toutes ces colonnes.
Utilisez une requête globale:
select g.ID, g.Name, g.Phone, count(*) over ( partition by g.name ) as Count
from
Guys g;
Vous pouvez toujours utiliser un GROUP BY
pour le décompte, il vous suffit de JOIN
de le renvoyer à votre table d'origine pour obtenir tous les enregistrements, comme ceci:
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
Dans Oracle DB, vous pouvez utiliser
SELECT ID,NAME,PHONE,(Select COUNT(ID)From GUYS GROUP BY Name)
FROM GUYS ;