2010-11-23 5 views
16

J'ai une table nommée GUYS (ID, NAME, PHONE) et j'ai besoin d'ajouter un compte de combien de gars ont le même nom et en même temps tous les montrer, donc je ne peux pas les grouper . exemple:compter sans groupe

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

la sortie désiré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 cela? Je réussis seulement à avoir beaucoup de gars avec des comptes différents.

grâce

Répondre

10

Vous pouvez toujours utiliser un GROUP BY pour le compte, il vous suffit de JOIN revenir à votre table d'origine pour obtenir tous les dossiers, comme celui-ci:

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

Depuis MySQL n » Si vous avez analytical functions like Oracle, vous devrez recourir à une sous-requête.

Ne pas utiliser GROUP BY, utilisez un sous-sélection pour compter le nombre de gars avec 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 l'exécution d'un sous-sélection pour chaque ligne serait lente, mais si vous avez des index appropriés, MySQL optimisera cette requête et vous verrez qu'elle fonctionne très bien.

Dans cet exemple, vous devez 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.

+1

J'attendais cette requête pour effectuer plus lent que la réponse de redfilter, mais qui n'a pas été le cas lors de mes tests . Avec une base de données de million de lignes, il a terminé en moins de la moitié du temps. J'ai le nom 'indexé'. – Tony

+0

De rien. :) – GolezTrol

13

Utilisez une requête globale:

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

'COUNT ... OVER (...)' n'est pas une syntaxe MySQL, et cette question est étiquetée MySQL. –

+2

Bien que ce ne soit pas pour MySQL, c'est une bien meilleure solution pour les gens d'Oracle. Merci Sowmia! – asgs

+0

fonctionne aussi pour mssql +1! –

0

Dans Oracle DB, vous pouvez utiliser

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

Questions connexes