无团体计数

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子查询的子句中有多个列,则查询可能会受益于所有这些列上的单个组合索引.

  • 我希望这个查询的执行速度比 redfilter 的答案慢,但在我的测试中情况并非如此。使用百万行数据库,它在不到一半的时间内完成。我确实有“名称”索引。 (2认同)

小智 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)

  • `COUNT ... OVER(...)`不是MySQL语法,这个问题标记为MySQL. (7认同)
  • 虽然这不适用于MySQL,但对于Oracle人员来说这是更好的解决方案.谢谢Sowmia! (4认同)

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)