eas*_*ast 27 mysql sql aggregate-functions
我有一个名为GUYS(ID,NAME,PHONE)的表,我需要添加一个有多少人具有相同名称的计数,同时显示所有这些,所以我不能将它们分组.例:
ID NAME PHONE
1 John 335
2 Harry 444
3 James 367
4 John 742
5 John 654
Run Code Online (Sandbox Code Playgroud)
想要的输出应该是
ID NAME PHONE COUNT
1 John 335 3
2 Harry 444 1
3 James 367 1
4 John 742 3
5 John 654 3
Run Code Online (Sandbox Code Playgroud)
我怎么能这样做?我只是设法让很多人有不同的数量.
谢谢
Gol*_*rol 25
由于MySQL没有像Oracle这样的分析函数,因此您不得不求助于子查询.
不要使用GROUP BY,使用子选择来计算具有相同名称的人数:
SELECT
t.name,
t.phone,
(SELECT COUNT('x') FROM Guys ct
WHERE ct.name = t.name) as namecounter
FROM
Guys t
Run Code Online (Sandbox Code Playgroud)
你认为为每一行运行一个子选择会很慢,但如果你有适当的索引,MySQL会优化这个查询,你会发现它运行得很好.
在此示例中,您应该有一个索引Guys.name.如果where子查询的子句中有多个列,则查询可能会受益于所有这些列上的单个组合索引.
小智 25
使用聚合查询:
select g.ID, g.Name, g.Phone, count(*) over ( partition by g.name ) as Count
from
Guys g;
Run Code Online (Sandbox Code Playgroud)
Red*_*ter 12
您仍然可以使用a 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
Run Code Online (Sandbox Code Playgroud)