我有一个名为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
我怎么能这样做?我只是设法让很多人有不同的数量。
感谢
答案 0 :(得分:23)
由于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 :(得分:20)
使用聚合查询:
select g.ID, g.Name, g.Phone, count(*) over ( partition by g.name ) as Count
from
Guys g;
答案 2 :(得分:11)
您仍然可以使用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
答案 3 :(得分:0)
在Oracle DB中,您可以使用
SELECT ID,NAME,PHONE,(Select COUNT(ID)From GUYS GROUP BY Name)
FROM GUYS ;
答案 4 :(得分:0)
select id, name, phone,(select count(name) from users u1 where u1.name=u2.name) count from users u2
答案 5 :(得分:-1)
DECLARE @tbl table
(ID int,NAME varchar(20), PHONE int)
insert into @tbl
select
1 ,'John', 335
union all
select
2 ,'Harry', 444
union all
select
3 ,'James', 367
union all
select
4 ,'John', 742
union all
select
5 ,'John', 654
SELECT
ID
, Name
, Phone
, count(*) over(partition by Name)
FROM @tbl
ORDER BY ID