2010-11-23 99 views
16

我有一个名为GUYS(ID,NAME,PHONE)的表,我需要添加一个有多少人具有相同名称并同时显示所有人的计数,所以我不能将它们分组。 例如:没有组计数

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

想要的输出应该

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

我怎么能做到这一点?我只设法得到很多不同的人。

感谢

回答

10

你仍然可以使用的计数GROUP BY,你只需要JOIN回你原来的表来获取所有的记录,像这样:

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

由于MySQL的没有按”没有analytical functions like Oracle,你必须求助于子查询。

不要使用GROUP BY,使用子选择具有相同名称的数人的数量:

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

你会认为运行一个子选择的每一行都将是缓慢,但如果你有合适的索引,MySQL会优化这个查询,你会发现它运行得很好。

在这个例子中,你应该有一个索引Guys.name。如果子查询的where子句中有多个列,则查询可能会受益于所有这些列上的单个组合索引。

+1

我预计这个查询比redfilter的答案进行比较慢,但是这不是在我的测试情况。拥有一百万行数据库,它在不到一半的时间内完成。我有'名字'索引。 – Tony 2012-08-02 17:33:08

+0

不客气。 :) – GolezTrol 2012-08-03 07:23:25

13

使用汇总查询:

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

Oracle数据库中,你可以使用

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